이 이름을 가진 파일은 삭제할 수 없습니다.

이 이름을 가진 파일은 삭제할 수 없습니다.

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이를 확인할 수 있습니다. 이름에서 알 수 있듯이 출력은 셸처럼 인용되므로 셸에 대한 입력으로 사용할 수 있습니다. 따라서 인용/이스케이프 처리된 출력을 lsBash에 복사하여 붙여넣으면 파일 중 하나 또는 둘 모두가 제거됩니다.

ls -l ''$'\n' 'b.txt'$'\n

물론, rm ...올바른 파일을 받았는지 확인한 후입니다.

그만한 가치가 있기 때문에 첫 번째 파일 이름은 단일 개행이고(어떤 이유로 이스케이프는 앞에 null을 추가함 '') 두 번째 파일 이름은 b.txt마지막 개행입니다.

답변2

"rm"을 입력하세요.ls에 의해 표시되는 파일 이름" 예를 들어 파일 삭제

rm ''$'\n'

배경:

  1. 파일 이름에 개행 문자가 추가되어 있습니다(또는 의 경우 ''$'\n'개행 문자만 있어도 됨).
  2. ls -N다른(기존) 보기를 보려면 입력하세요.
  3. $'\n'개행 문자 표현에 대해서는 "ANSI-C 참조"(http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html)
  4. ls의 다양한 출력 형식에 대해서는 "GNU Coreutils - 파일 이름 인용"(https://www.gnu.org/software/coreutils/quotes.html) 또는 매뉴얼 페이지 ls(1) ( man 1 ls) - "참조"를 찾으십시오.
  5. 쉘 탭 완성 기능이 개행 문자가 포함된 파일 이름을 올바르게 처리하지 못하는 것 같습니다. 특히''$'\n'
  6. 줄 바꿈으로 시작하는 파일 이름은 ls작은따옴표 두 개를 앞에 추가하여 특별히 처리됩니다. 아마도 버그일 수 있습니다.

관련 정보