Làm cách nào để nhập tệp hoặc thư mục có ký tự đặc biệt trong tên của nó?


44

Tôi muốn nhập thư mục sau vào terminal:

Milano, Torino (Jan)-Compressed

Làm thế nào tôi nên viết lệnh cdđể vào thư mục này?

Spaces và một số ký tự đặc biệt khác như \, *, ), (?các vấn đề gây ra khi tôi cố gắng sử dụng chúng trong các dòng lệnh hoặc các kịch bản, ví dụ như:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token `newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

Làm cách nào để nhập tên tệp hoặc thư mục chứa các ký tự đặc biệt trong thiết bị đầu cuối nói chung?


Câu trả lời:


43

Lệnh đó không rõ ràng vì các khoảng trắng thường được sử dụng để phân tách các đối số. cd không biết bạn muốn làm gì nhưng bạn có hai khả năng để giải quyết nó:

Hoặc bạn " che dấu " các khoảng trắng (và tất cả các ký tự đặc biệt khác) để thiết bị đầu cuối biết bạn có nghĩa là không gian như một ký tự chứ không phải là dấu phân cách:

cd Milano\,\ Torino\ \(Jan\)-Compressed

Hoặc bạn đặt tên thư mục hoặc đường dẫn của bạn vào dấu ngoặc kép :

cd "Milano, Torino (Jan)-Compressed"

26

Một mẹo nhỏ: hoàn thành tab ;-)

  1. Chỉ cần gõ chữ cái đầu tiên, ví dụ cd Mi(hoặc nhiều chữ cái nếu cần) và nhấn Tab. Terminal sẽ giúp bạn bằng cách hoàn thành các từ còn lại.

Một cách khác: kéothả

  1. Nếu bạn có thể thấy thư mục và nếu bạn muốn truy cập nó bằng terminal, chỉ cần gõ: cdđầu tiên, sau đó kéo và thả thư mục trên terminal và nhấn enter.

24

Viết nó như sau:

cd 'Milano, Torino (Jan)-Compressed'

Nếu không, nó được coi Milano,là tên thư mục. Điều này xảy ra vì các khoảng trắng trong tên của thư mục. Hoặc thoát khỏi một vài nhân vật đặc biệt:

cd Milano\,\ Torino\ \(Jan\)-Compressed/

22

tl; dr : Để trích dẫn một ký tự đặc biệt hoặc thoát nó bằng dấu gạch chéo ngược \hoặc đặt nó trong " "dấu ngoặc kép hoặc dấu ngoặc đơn ' '. Tab ↹Hoàn thành chăm sóc trích dẫn thích hợp.


Những gì bạn đang yêu cầu được gọi là Trích dẫn :

Trích dẫn được sử dụng để loại bỏ ý nghĩa đặc biệt của các ký tự hoặc từ nhất định vào vỏ. (Hoài) Có ba cơ chế trích dẫn: ký tự thoát , dấu ngoặc đơndấu ngoặc kép . [trích dẫn lấy từ man bash]

Trích dẫn với nhân vật thoát \

Dấu gạch chéo ngược không trích dẫn ( \) là ký tự thoát. Nó bảo tồn giá trị theo nghĩa đen của ký tự tiếp theo, ngoại trừ <newline>.

Vì vậy, để nhập một thư mục hoặc một tệp có một ký tự đặc biệt, hãy thoát cái sau bằng \, ví dụ:

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \\  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”

bash's Programmable Completion (aka Tab ↹Hoàn) tự động thoát ký tự đặc biệt với các ký tự thoát \.

Trích dẫn với dấu ngoặc kép " "

Kèm theo ký tự trong dấu ngoặc kép giữ gìn giá trị văn chương của tất cả các ký tự trong dấu ngoặc kép, với ngoại lệ của $, `, \, và, khi mở rộng lịch sử được kích hoạt, !.

Vì vậy, để nhập một thư mục hoặc một tệp có ký tự đặc biệt, hãy thoát ít nhất phần sau hoặc phần lớn hơn của tên tệp hoặc đường dẫn của bạn bằng dấu ngoặc kép, ví dụ:

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

Như $, `!giữ ý nghĩa đặc biệt của chúng bên trong dấu ngoặc kép, Mở rộng tham số , Thay thế lệnh , Mở rộng số họcMở rộng lịch sử được thực hiện trên các chuỗi trích dẫn kép.

Trích dẫn với dấu ngoặc đơn ' '

Các ký tự kèm theo trong dấu ngoặc đơn duy trì giá trị theo nghĩa đen của từng ký tự trong dấu ngoặc kép. Một trích dẫn có thể không xảy ra giữa các trích dẫn đơn, ngay cả khi trước dấu gạch chéo ngược.

Vì vậy, để nhập một thư mục hoặc một tệp có ký tự đặc biệt, hãy thoát ít nhất phần sau hoặc phần lớn hơn của tên tệp hoặc đường dẫn của bạn bằng dấu ngoặc kép, ví dụ:

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

Bạn có thể tìm hiểu thêm về Trích dẫn trong man bash/ QUOTING , trên wiki.bash-hackers.org và trên tldp.org .


10

Chuỗi giống như C và $ 'chuỗi'

Trong số những thứ khác, người ta có thể sử dụng $'...'loại trích dẫn để sử dụng các ký tự dấu gạch chéo ngược ANSI-C như \n, và \tbao gồm cả các ký tự bạn đã đề cập. Từ hướng dẫn bash 4.3:

Các từ có dạng $ 'chuỗi' được xử lý đặc biệt. Từ này mở rộng thành chuỗi, với các ký tự thoát dấu gạch chéo ngược được thay thế theo quy định của tiêu chuẩn ANSI C.

Điều này đặc biệt hữu ích với các tệp chứa dòng mới, tab, khi bạn đang viết các dòng awk phức tạp, nơi bạn cần sử dụng các cách khác nhau để phân biệt giữa dấu ngoặc đơn và dấu ngoặc kép, khi tên tệp có chứa dấu ngoặc kép đơn / kép, v.v.

Ví dụ: tạo và liệt kê các tệp như vậy:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

Bạn có thể sử dụng các giá trị hex ký tự, chẳng hạn như:

$ touch 'file(name'
$ ls file$'\x28'name
file(name

in

Tương tự như trước - tận dụng các ký tự thoát:

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

Sử dụng inodes:

Mỗi tệp hoặc thư mục có cấu trúc dữ liệu đặc biệt được liên kết với nó được gọi là inode, được tham chiếu bởi một số thập phân cụ thể. Vì vậy, bạn có thể sử dụng điều đó để gián tiếp định vị tệp có inode cụ thể thông qua findlệnh và thực hiện một cái gì đó với nó:

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

Tránh xử lý các tệp riêng lẻ khi bạn có thể sử dụng toàn cầu

Khi bạn không phải xử lý các tệp riêng lẻ, chỉ cần tận dụng *ký tự toàn cầu trong shell và trích dẫn các biến khi chuyển chúng sang các lệnh khác. Nó làm cho việc xử lý các tên tệp khó dễ hơn nhiều:

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

Lưu ý việc sử dụng ./- một biện pháp bảo vệ chống lại tên tệp có thể chứa hàng đầu -trong đó.


6

Để mở một thư mục chứa một khoảng trắng bao quanh nó trong dấu ngoặc kép như cd "Some Directory"hoặc thoát khỏi khoảng trắng bằng dấu gạch chéo ngược, như : cd /home/kudic/Radna\ površina.


3
Hoặc thoát khỏi không gian bằng dấu gạch chéo ngược, như:cd /home/kudic/Radna\ površina
Timo

Điểm tuyệt vời! Tôi quên đề cập đến. Tôi thường sử dụng dấu ngoặc kép theo thói quen, nhưng dấu gạch chéo ngược thực sự tốt hơn để sử dụng trong thời gian dài.
Corey Whitaker

1
Hoặc sử dụng dấu ngoặc đơn ( 'Radna površina'), nếu bạn không muốn các biến môi trường ( $VARNAME) được mở rộng và các lệnh được đặt trong backticks hoặc $()được chạy (hoặc nếu có dấu ngoặc kép trong tên tệp).
Eliah Kagan

3

Nếu thư mục này nằm trong thư mục nhà của bạn thì gõ:

cd "Milano, Torino (Jan)-Compressed"

khác đưa ra đường dẫn tuyệt đối:

cd "/…/…/Milano, Torino (Jan)-Compressed"

nếu có một trích dẫn kép trong tên tệp thì thoát khỏi đó với \"


Nếu bạn bắt đầu một đường dẫn với dấu gạch chéo phía trước, nó sẽ đi từ gốc. Bạn có thể muốn loại bỏ điều đó.
isaaclw

@isaaclw Đó là lý do tại sao anh ấy đã gửi nó như một đường dẫn tuyệt đối: P

1
À, đó là ba dấu chấm, biểu thị một thư mục "biến". Tôi giả sử đó là hai dấu chấm, biểu thị "thư mục mẹ". Lời xin lỗi.
isaaclw

3

Một lựa chọn khác mặc dù không phải là tốt nhất trong trường hợp này là sử dụng ký tự đại diện. Bạn co thể thử:

cd *Torino*

Tốt nhất là sử dụng phương pháp này khi có một từ hoặc cụm từ riêng biệt trong tên của một thư mục không được người khác chia sẻ. Ví dụ: tôi có các điểm gắn kết / phương tiện / DataSSD và / media / DataHDD. Tự động hoàn tất không hoạt động cho đến khi tôi gõ gần một nửa tên vì vậy để đến phân vùng ổ cứng của tôi, tôi chỉ cần gõ

cd /media/*HD*

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.