C로 파일 관리 프로그램을 작성하다가 실수로 삭제할 수 없는 파일이 두 개 생성되었습니다.
파일 1:
''$'\n'
파일 2:'b.txt'$'\n'
두 번 입력 rm
하고 탭해도 tab
표시되지 않습니다.
어떻게 삭제하나요?
편집하다:
출력 ls -la
:
-rw-r--r-- 1 pi pi 0 Feb 7 04:12 ''$'\n'
-rw-r--r-- 1 pi pi 0 Feb 7 00:48 'b.txt'$'\n'
답변1
'b.txt'$'\n'
이것은 아마도 마지막 작은따옴표와 함께 후자에 있어야 합니다 .
이는 인용 스타일을 사용한 GNU ls의 출력과 유사합니다 shell-escape
. 최신 버전의 GNU ls는 기본적으로 이러한 참조를 사용합니다. 동일한 출력이 제공되는지 확인하기 위해 실행하여 ls -l --quoting-style=shell-escape
이를 확인할 수 있습니다. 이름에서 알 수 있듯이 출력은 셸처럼 인용되므로 셸에 대한 입력으로 사용할 수 있습니다. 따라서 인용/이스케이프 처리된 출력을 ls
Bash에 복사하여 붙여넣으면 파일 중 하나 또는 둘 모두가 제거됩니다.
ls -l ''$'\n' 'b.txt'$'\n
물론, rm ...
올바른 파일을 받았는지 확인한 후입니다.
그만한 가치가 있기 때문에 첫 번째 파일 이름은 단일 개행이고(어떤 이유로 이스케이프는 앞에 null을 추가함 ''
) 두 번째 파일 이름은 b.txt
마지막 개행입니다.
답변2
"rm"을 입력하세요.ls에 의해 표시되는 파일 이름" 예를 들어 파일 삭제
rm ''$'\n'
배경:
- 파일 이름에 개행 문자가 추가되어 있습니다(또는 의 경우
''$'\n'
개행 문자만 있어도 됨). ls -N
다른(기존) 보기를 보려면 입력하세요.$'\n'
개행 문자 표현에 대해서는 "ANSI-C 참조"(http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html)- ls의 다양한 출력 형식에 대해서는 "GNU Coreutils - 파일 이름 인용"(https://www.gnu.org/software/coreutils/quotes.html) 또는 매뉴얼 페이지 ls(1) (
man 1 ls
) - "참조"를 찾으십시오. - 쉘 탭 완성 기능이 개행 문자가 포함된 파일 이름을 올바르게 처리하지 못하는 것 같습니다. 특히
''$'\n'
- 줄 바꿈으로 시작하는 파일 이름은
ls
작은따옴표 두 개를 앞에 추가하여 특별히 처리됩니다. 아마도 버그일 수 있습니다.