이름에 특수 문자가 포함 된 파일 또는 디렉토리를 입력하려면 어떻게합니까?


44

터미널에 다음 폴더를 입력하고 싶습니다.

Milano, Torino (Jan)-Compressed

cd이 디렉토리에 들어가기 위한 명령 을 어떻게 작성해야 합니까?

공간과 여러 가지 다른 특수 문자가 좋아 \, *, ), (?원인 문제를 내가 명령 줄 또는 스크립트 예에서 사용하려고 할 때 :

$ 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 ?
(  )  *  ?  \

터미널에 특수 문자가 포함 된 파일 또는 디렉토리 이름을 입력하려면 어떻게합니까?


답변:


43

공백은 일반적으로 인수를 구분하는 데 사용되므로이 명령은 모호합니다. cd는 무엇을하고 싶은지 모르지만 그것을 해결할 수있는 두 가지 가능성이 있습니다.

터미널이 공백을 문자가 아닌 구분 기호가 아니라 문자로 알고 있음을 알 수 있도록 공백 (및 기타 모든 특수 문자) 을 " 마스크 "하십시오.

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

또는 폴더 이름이나 경로를 따옴표묶습니다 .

cd "Milano, Torino (Jan)-Compressed"

26

작은 팁 : 탭 완성 ;-)

  1. 첫 글자 (예 : cd Mi더 많은 글자)를 입력하고를 누릅니다 Tab. 터미널은 나머지 단어를 완성하여 당신을 도울 것입니다.

또 다른 방법 : 드래그드롭

  1. 디렉토리를 볼 수 있고 터미널을 사용하여 액세스하려면 cd먼저 다음을 입력하십시오. 먼저 터미널에 디렉토리를 끌어다 놓고을 누르십시오 enter.

24

다음과 같이 작성하십시오.

cd 'Milano, Torino (Jan)-Compressed'

그렇지 않으면 Milano,폴더 이름으로 취급 됩니다. 폴더 이름에 공백이 있기 때문에 발생합니다. 또는 몇 가지 특수 문자를 피하십시오.

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

22

tl; dr : 특수 문자를 인용하려면 백 슬래시로 이스케이프 처리 \하거나 큰 " "따옴표 나 작은 따옴표로 묶으십시오 ' '. Tab ↹완성은 적절한 인용을 처리합니다.


당신이 요구하는 것을 Quoting 이라고합니다 :

인용은 특정 문자 나 단어가 쉘에 특수한 의미를 제거하는 데 사용됩니다. (…) 세 가지 인용 메커니즘이 있습니다 : 이스케이프 문자 , 작은 따옴표큰 따옴표 . [인용문 man bash]

이스케이프 문자로 인용 \

따옴표가없는 백 슬래시 ( \)는 이스케이프 문자입니다. 다음을 제외한 다음 문자의 리터럴 값을 유지합니다 <newline>.

따라서 특수 문자가있는 디렉토리 또는 파일을 입력하려면 다음과 같이 후자를 이스케이프하십시오 \.

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프로그램 완료 (일명 Tab ↹완료)가 자동으로 이스케이프 문자와 특수 문자를 이스케이프합니다 \.

큰 따옴표로 인용 " "

큰 따옴표 문자를 묶는 것은 제외하고, 따옴표 내의 모든 문자의 리터럴 값을 보존 $, `, \,와, 역사 확장을 사용하는 경우, !.

따라서 특수 문자가 포함 된 디렉토리 또는 파일을 입력하려면 최소한 파일 이름 또는 경로의 큰 부분 또는 큰 따옴표를 큰 따옴표로 이스케이프하십시오.

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 “?”

$, `그리고 !따옴표, 내부에 자신의 특별한 의미를 유지하는 매개 변수 확장 , 명령 치환 , 연산 확장역사 확장 따옴표 문자열에서 수행됩니다.

작은 따옴표로 인용 ' '

작은 따옴표로 문자를 묶으면 따옴표 안에 각 문자의 리터럴 값이 유지됩니다. 백 슬래시가 앞에 있어도 작은 따옴표 사이에는 작은 따옴표가 없을 수 있습니다.

따라서 특수 문자가 포함 된 디렉토리 또는 파일을 입력하려면 최소한 파일 이름 또는 경로의 큰 부분 또는 큰 따옴표를 큰 따옴표로 이스케이프하십시오.

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 “\”

당신의 인용에 대한 자세한 찾을 수 있습니다 man bash/ 인용wiki.bash-hackers.org 과에 tldp.org .


10

C와 같은 문자열과 $ 'string'

무엇보다도 언급 한 유형을 포함하여 and와 $'...'같은 ANSI-C 백 슬래시 문자를 사용하기 위해 인용 유형을 사용할 수 있습니다 . bash 4.3 매뉴얼에서 :\n\t

$ 'string'형식의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자를 바꾸어 단어를 문자열로 확장합니다.

이것은 파일 이름 자체에 작은 / 큰 따옴표 mishmash 등이 포함 된 경우 작은 따옴표와 큰 따옴표를 구별하기 위해 다른 방법을 사용해야하는 복잡한 awk 행을 작성할 때 줄 바꿈, 탭이 포함 된 파일에 특히 유용합니다.

예를 들어, 이러한 파일을 작성하고 나열하는 경우 :

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

다음과 같은 문자 16 진수 값을 사용할 수 있습니다.

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

printf

이전과 동일한 아이디어-이스케이프 문자를 활용하십시오.

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

아이 노드 사용 :

모든 파일 또는 디렉토리에는 특정 10 진수로 참조되는 inode라는 특수 데이터 구조가 있습니다. 따라서이를 사용하여 find명령을 통해 특정 inode를 사용하여 파일을 간접적으로 찾고 파일로 무언가를 수행 할 수 있습니다.

$ 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

glob를 사용할 수있을 때 개별 파일을 다루지 마십시오

개별 파일을 다룰 필요가없는 경우, *쉘에서 glob 문자를 이용하고 변수를 다른 명령으로 전달할 때 인용하십시오. 어려운 파일 이름을 다루는 것이 훨씬 쉽습니다.

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

./파일 이름을 포함 할 수있는 파일 이름에 대한 보호 장치를 사용하십시오 -.


6

공백이 포함 된 폴더를 열려면 다음과 같이 따옴표로 묶 cd "Some Directory"거나 백 슬래시로 공백을 이스케이프하십시오 cd /home/kudic/Radna\ površina.


3
또는 다음과 같이 백 슬래시로 공간을 탈출하십시오.cd /home/kudic/Radna\ površina
Timo

좋은 지적입니다! 나는 그것을 언급하는 것을 잊었다. 나는 일반적으로 습관에서 따옴표를 사용하지만 백 슬래시는 실제로 장기적으로 사용하는 것이 좋습니다.
Corey Whitaker

1
또는 'Radna površina'환경 변수 ( $VARNAME)를 확장하고 명령을 백틱으로 묶거나 $()실행 하지 않으려면 (또는 파일 이름에 큰 따옴표가있는 경우) 작은 따옴표 ()를 사용하십시오.
Eliah Kagan

3

이 디렉토리가 홈 폴더에 있으면 다음을 입력하십시오.

cd "Milano, Torino (Jan)-Compressed"

그렇지 않으면 절대 경로를 제공하십시오.

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

파일 이름에 큰 따옴표가 있으면 \"


슬래시로 경로를 시작하면 루트에서 시작합니다. 그것을 제거하고 싶을 수도 있습니다.
isaaclw

@isaaclw 그래서 그는 그것을 절대 경로로 제출했습니다 : P

1
아, 그것은 "가변"폴더를 나타내는 3 개의 점입니다. "부모 폴더"를 나타내는 두 개의 점으로 가정했습니다. 사과.
isaaclw

3

이 경우 가장 좋지 않은 다른 옵션은 와일드 카드를 사용하는 것입니다. 당신은 시도 할 수 있습니다:

cd *Torino*

다른 사람이 공유하지 않는 디렉토리 이름에 고유 한 단어 나 구가있을 때이 방법을 사용하는 것이 가장 좋습니다. 예를 들어 마운트 지점 / media / DataSSD 및 / media / DataHDD가 있습니다. 이름의 거의 절반을 입력 할 때까지 자동 완성이 작동하지 않으므로 HDD 파티션에 도착하기 위해 방금 입력하십시오.

cd /media/*HD*

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.