파일 이름에 '(아포스트로피)가 포함되어 있습니다.

파일 이름에 '(아포스트로피)가 포함되어 있습니다.

이름에 공백이 있는 파일을 나열하면 대부분 아포스트로피로 둘러싸인 것을 볼 수 있습니다.

'famille, vacances, loisirs'

Chapitre 2 : L'accès au système.md아포스트로피가 포함된 이름이 이어야 하는 파일을 편집해야 합니다 .


나는 시도했다:

gvim 'Chapitre 2 : L''accès au système.md'

중간 아포스트로피가 두 배로 표시됩니다. 하지만 'Chapitre 2 : Laccès au système.md'아포스트로피가 전혀 없는 파일을 생성합니다 .


나는 시도했다:

gvim "Chapitre 2 : L'accès au système.md"

다음과 같은 파일이 생성됩니다."Chapitre 2 : L'accès au système.md"


두 가지 질문이 있습니다.

  1. (시스템의 경우) 파일 이름: "Chapitre 2 : L'accès au système.md"이 작업을 성공적으로 수행했을 때 이름이 지정된 것과 동일한 파일입니까?'Chapitre 2 : L'accès au système.md'

  2. 내 파일에 파일 이름을 어떻게 써야 하나요?'Chapitre 2 : L'accès au système.md'출력에서 읽고 싶은 정확한 파일 이름을 가져오는 명령엘에스주문하다?

답변1

ls출력을 명확하게 만들기 위해 쉘의 인용 규칙을 사용하여 파일 이름이 출력되는 일부 시스템에 있습니다 . 예를 들어 GNU ls는 QUOTING_STYLE로 설정되거나 shell이것이 ls기본값인 coreutils >= 8.25에서 설정될 수 있습니다. 명령줄에 파일 이름을 입력할 때 쉘의 인용 규칙도 중요합니다.

gvim 'Chapitre 2 : L''accès au système.md''Chapitre 2 : Laccès au système.md'대신 아포스트로피가 전혀 없는 파일이 생성됩니다 .

쉘에 두 개의 작은따옴표 문자열을 연속적으로 제공하면 연결됩니다. SQL에서는 이런 식으로 작은따옴표를 얻을 수 있지만 대부분의 일반적인 쉘에서는 (†) 할 수 없습니다 . 표시되는 바깥쪽 작은따옴표는 파일 이름의 일부가 되어서는 안 되며 ls출력을 명확하게 하기 위해 표시되는 것일 뿐입니다 . 실제 파일 이름은 Chapitre 2 : Laccès au système.md.

(† POSIX 스타일 쉘(예: 기본 설정의 Bash, ksh 및 zsh), (t)csh 및 Fish는 이를 연결로 취급하며 이는 Python 등에서도 작동하는 방식입니다. 다른 쉘(rc/ es/ akanga )는 SQL이 수행하는 작업을 수행하지만 zsh는 선택적으로 수행할 수 있습니다 rcquotes.

gvim "Chapitre 2 : L'accès au système.md"다음이라는 파일을 만들었습니다."Chapitre 2 : L'accès au système.md"

이름을 생성할 가능성이 높습니다 . 큰따옴표는 이름의 일부가 아니며 출력을 명확하게 하기 위해 Chapitre 2 : L'accès au système.md인쇄됩니다 . ls여기서는 이름에 작은따옴표가 있기 때문에 작은따옴표 대신 큰따옴표를 사용하는데, 큰따옴표에는 특별한 것이 없으므로 이 형식이 가장 깔끔합니다. 하지만


  1. (시스템의 경우) 파일 이름: "Chapitre 2 : L'accès au système.md"이 작업을 성공적으로 수행했을 때 이름이 지정된 것과 동일한 파일입니까?'Chapitre 2 : L'accès au système.md'

이것이 전체 파일 이름이고 파일 이름으로 유효한 경우! -- 그렇다면 아니요, 다른 하나는 두 개의 큰따옴표와 하나의 작은따옴표를 포함하고 다른 하나는 세 개의 작은따옴표를 포함하기 때문에 동일하지 않습니다.

쉘의 인용 규칙을 사용하여 해석할 때 동일한지 여부를 의미한다면 다시는 아니오입니다. "Chapitre 2 : L'accès au système.md"문자열을 Chapitre 2 : L'accès au système.md단일 쉘 단어로 나타냅니다(따옴표로 묶어두기 때문).

반면에 는 'Chapitre 2 : L'accès au système.md'문자열 Chapitre 2 : Laccès, au, système.md(따옴표가 없는 공백이 있기 때문에 세 가지 다른 쉘 단어)와 닫는 파트너가 없는 열린 따옴표를 나타냅니다. 쉘 명령줄에 이것을 입력하면 닫는 따옴표를 얻기 위해 다른 입력 줄을 기다립니다. 끝에 흩어진 따옴표 없이 이를 셸 명령줄에서 명령에 대한 인수로 입력하면 명령이 이러한 세 가지 다른 파일에 액세스하려고 시도할 수 있습니다.

  1. 'Chapitre 2 : L'accès au système.md'ls 명령의 출력에서 ​​읽고 싶은 정확한 파일 이름을 얻으려면 gvim 명령에 파일 이름을 어떻게 써야 합니까 ?

쉘 스타일 인용 문자열을 출력하는 모드에서는 ls출력 할 수 없습니다 'Chapitre 2 : L'accès au système.md'. 이는 유효한 쉘 스타일 인용 문자열이 아니기 때문입니다. 끝에 닫히지 않은 인용 부호가 있습니다.


이제 처음에 말씀하신 내용으로 돌아가면 다음과 같습니다.

Chapitre 2 : L'accès au système.md아포스트로피가 포함된 이름이 이어야 하는 파일을 편집해야 합니다 .

이를 쉘에서 표현하는 방법에는 여러 가지가 있습니다. 그 중 하나는 큰따옴표를 사용하는 것인데, 이 방법 ls도 효과가 있습니다: "Chapitre 2 : L'accès au système.md". 이는 내부의 어떤 문자도 큰따옴표로 묶인 특별한 문자가 아니기 때문에 작동하지만(공백과 작은따옴표로만 보호됨), 예를 들어 파일 이름에 달러 기호가 포함되어 있으면 작동하지 않습니다. 달러 기호가 있는 경우 백슬래시를 사용하여 이스케이프할 수 있습니다 \$.

또 다른 방법은 작은 따옴표 자체를 제외한 모든 항목에 작은 따옴표를 사용하고 이스케이프된 작은 따옴표를 원하는 위치에 넣는 것입니다 'Chapitre 2 : L'\''accès au système.md'. 여기에는 'Chapitre 2 : L', \'및 의 세 부분이 포함되어 있으며 'accès au système.md'따옴표와 백슬래시가 제거되고 결과가 단일 단어로 연결됩니다 Chapitre 2 : L'accès au système.md.

답변2

두 질문 모두 \해석되지 않도록 이스케이프 특수 문자를 사용하십시오(bash라고 가정합니다). 귀하의 예를 따르십시오.

ls Chapitre\ 2\ :\ L\'accès\ au\ système.md
또는
gvim Chapitre\ 2\ :\ L\'accès\ au\ système.md.

보다배쉬 참조 매뉴얼더 많은 정보를 알고 싶습니다.

답변3

공백과 특수 문자가 포함된 이름은 항상 문제의 원인이 됩니다. 인용은 항상 까다롭습니다...

gvim "Chapitre 2 : L'accès au système.md" 

원하는대로 작동하고 있습니다. ls파일 이름을 보다 명확하게 구분하기 위해 추가 따옴표(")가 표시되지만 이름에는 따옴표가 없습니다.

이렇게 하면 ls | more보호되지 않은 이름이 표시됩니다.



더 복잡한 이름이 정말로 필요한 경우(나쁜 생각), 인용된 블록과 보호된 요소를 연결할 수 있습니다(@ferranm 참조).

예 - 3개 블록 a filename with quotes", apostrophes 'and bars (\) 의 합으로 이름이 지정된 파일을 생성할 수 있습니다 "a filename with quotes" . ++ '", '"apostrophes 'and bars (\)"

touch "a filename with quotes"'", '"apostrophes 'and bars (\)"

관련 정보