잘못 작성된 스크립트로 인해 '--'
내 홈 디렉토리에 (작은따옴표 포함)이라는 디렉토리가 생성되었습니다.
해당 디렉토리에 들어가면 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 \'--\'
더 일반적인 경우는 따옴표가 이름의 일부가 아니기 때문에 -
이름이 옵션(다음으로 시작)처럼 보인다는 사실도 처리해야 합니다. 이 경우 고전적인 접근 방식은 다음과 같습니다.
옵션이 다음 으로 시작하더라도 옵션으로 구문 분석되지 않도록
--
옵션의 끝을 나타내는 데 사용됩니다 .--
-
rmdir -- "'--'"
전체 경로를 사용하거나 다음을 사용하십시오 (단, 셸에서
./
보호하려면 이름을 인용해야 합니다 ).'
rmdir ./"'--'"
GNU 사용
find
:find . -name "'--'" -delete
다른 것을 사용하십시오. 펄처럼:
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
(적어도 출력은 그렇게 보입니다). 따라서 실제로 긴 옵션을 철자할 필요는 없습니다.