이름이 "--"인 디렉터리를 삭제하는 방법(작은따옴표는 이름의 일부임)

이름이 "--"인 디렉터리를 삭제하는 방법(작은따옴표는 이름의 일부임)

잘못 작성된 스크립트로 인해 '--'내 홈 디렉토리에 (작은따옴표 포함)이라는 디렉토리가 생성되었습니다.

해당 디렉토리에 들어가면 cd홈 디렉토리로 돌아갑니다.

이 프로젝트를 삭제하고 싶은데 어떻게 해야 할지 모르겠습니다. 디렉터리 이름의 일부 또는 모든 문자를 이스케이프하여 반환합니다 No such file or directory.

리눅스 버전

Linux version 5.11.0-1022-aws (buildd@lgw01-amd64-036) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #23~20.04.1-Ubuntu SMP Mon Nov 15 14:03:19 UTC 2021

답변1

귀하의 경우 실제로 이름의 일부로 따옴표가 있으므로 다음을 수행할 수 있습니다.

rm -r \'--\'

또는

rmdir \'--\'

더 일반적인 경우는 따옴표가 이름의 일부가 아니기 때문에 -이름이 옵션(다음으로 시작)처럼 보인다는 사실도 처리해야 합니다. 이 경우 고전적인 접근 방식은 다음과 같습니다.

  1. 옵션이 다음 으로 시작하더라도 옵션으로 구문 분석되지 않도록 --옵션의 끝을 나타내는 데 사용됩니다 .---

     rmdir -- "'--'"
    
  2. 전체 경로를 사용하거나 다음을 사용하십시오 (단, 셸에서 ./보호하려면 이름을 인용해야 합니다 ).'

     rmdir ./"'--'"
    
  3. GNU 사용 find:

     find . -name "'--'" -delete
    
  4. 다른 것을 사용하십시오. 펄처럼:

     perl -e "rmdir(\"'--'\")"
    

위의 모든 내용은 디렉터리가 비어 있다고 가정합니다. 그렇지 않은 경우 다음 중 하나를 사용하십시오.

rm -r ./"'--'"

또는

rm -r -- "'--'"

답변2

다른 답변에서 알 수 있듯이 따옴표, 백슬래시, 공백, 개행 등이 포함된 "흥미로운" 이름의 경우 인용 및/또는 이스케이프가 필요합니다.

그러나 터미널에서 (스크립트가 아닌) 대화형으로 파일 이름 작업을 하려는 경우 탭 완성 기능은 인용을 작성하는 데 정말 도움이 될 수 있습니다.

가지고 있는 디렉토리 이름을 사용하여 다음을 입력하십시오.

rm -r \'<tab>

<tab>키보드 문자 왼쪽의 Tab 키는 어디에 있습니까 ? 첫 번째 작은따옴표 문자는 특수 문자이므로 이스케이프를 Q사용합니다 .\'

작은따옴표 문자로 시작하는 다른 파일/디렉토리가 없으면 bash는 파일 이름을 올바르게 이스케이프하여 완성합니다.

rm -r \'--\'/

참고: 파일 이름의 첫 글자가 빼기 문자가 --아니기 때문에 다른 답변에서 제안한 "옵션 끝" 시퀀스를 추가할 필요가 없는 것 같습니다 .-

답변3

$ mkdir -- \'--\'
$ ls
'--'
$ rmdir -- \'--\'
$ ls
$

답변4

GNU coreutils 버전 ls(Linux에서 볼 수 있음)에는 --quoting-style인쇄할 수 없거나 기타 흥미로운 문자가 포함된 이름이 표시되는 방식을 제어하는 ​​옵션이 있습니다. 로 설정하면 shell-escape다양한 쉘 인용문을 사용하여 출력을 더 읽기 쉽게 만들고쉘 입력으로 유효함. 이 출력을 복사하여 셸 명령줄에 인수로 붙여넣을 수 있습니다 rm.

그러나 특수 문자를 더 쉽게 읽을 수 있도록 따옴표를 사용하며 $'...'현재 대부분의 쉘이 이를 지원하지만 모든 쉘이 지원하는 것은 아닙니다. 특히 Debian과 Ubuntu에서 사용되는 Dash 쉘은 /bin/sh이를 지원하지 않는 것 같습니다. 하지만 Bash, ksh 및 zsh는 확실히 그렇습니다.

여기서 두 번째 파일은 '--'큰따옴표로 묶인 yours 이고 다른 파일은 Ctrl-A, 탭, 줄 바꿈, 작은따옴표 및 후행 공백과 같은 문자를 포함하는 혐오스러운 파일입니다. 여기서는 $'..'백슬래시 이스케이프를 사용합니다.

$ ls --quoting-style=shell-escape -1
''$'\001\t'\''foo'$'\n''bar '
"'--'"

( ls출력을 최소화하려는 시도는 없는 것 같습니다. 첫 번째 출력은 그대로 인쇄될 수 있습니다 $'\001\t\'foo\nbar '.)

이 출력을 사용하여 다음 중 하나 또는 둘 다를 제거할 수 있습니다.

$ rm -- ''$'\001\t'\''foo'$'\n''bar '
$ rm -- "'--'"

--ls파일 이름이 대시로 시작하는 경우 대시가 인용된 것으로 표시 되더라도 대시를 사용해야 합니다 .

shell-escape나는 이것이 최근 버전에서도 사용되는 기본 인용 스타일이라고 생각합니다 ls(적어도 출력은 그렇게 보입니다). 따라서 실제로 긴 옵션을 철자할 필요는 없습니다.

관련 정보