이름에 하이픈이있는 UNIX 디렉토리 삭제


13

필자의 실수로 (예를 들어) -A라는 디렉토리를 실수로 만들어 파일로 채웠습니다.

해당 디렉토리를 삭제하고 싶습니다. 난 노력 했어:

rmdir -- -A

그러나 디렉토리에 여전히 파일이 있음을 알려줍니다. 그리고 나는 디렉토리로 들어가서 해당 파일을 삭제하는 방법을 알 수 없습니다.

이 성가신 디렉토리를 제거하려면 어떻게해야합니까?


5
운 좋게도 디렉토리 이름은 '-rf *'가 아니 었습니다.
user1686

stackoverflowunix 에서 동일합니다 .
Dorian

답변:


29

모든 명령에-를 사용하십시오.

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..

11

파일 앞에 ./를 넣을 수 있습니다. 이렇게하면 파일 이름이 옵션 플래그 인 것처럼 rm 또는 rmdir이 동작하지 않습니다.

또한 옵션을 발행 할 수 있습니다.이 옵션을 사용하면 rm 이후의 모든 것이 마치 파일 이름처럼 작동하고 더 이상 옵션을 처리하지 않아야합니다. 요즘에는 골동품 유닉스 동물원이 아주 작아서 펑키 한 RM 버전이있을 수 있습니다.

어쨌든 삭제할 때 이름 앞에 ./를 두는 습관을 가져야합니다. 디렉토리에 -r 또는 -rf라는 이름의 파일이 있는지 알 수 없습니다. 당신은 항상 ---를 사용해야한다고 말할 수 있지만 ./는 더 자연 스럽습니다. "*이 디렉토리에서 파일을 삭제하고 싶습니다.



2

rmdir은 내부에 아무 것도없는 디렉토리를 삭제하지 않습니다. "rm -rf"가됩니다. rmdir은 "rm -rf"보다 훨씬 안전합니다. 무의 대답은 여전히 ​​최고 일 것입니다.


1
rm -fr ./-A

위의 명령이 저에게 효과적입니다.


0

다른 방법은 inode로 삭제하는 것입니다 (이것은 rm만으로는 삭제하기 어려운 다른 문자가있는 파일 / 디렉토리에서 작동합니다).

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$

rm은 여전히 ​​커맨드 라인에서 -A 인수를 전달받으며 여전히 옵션으로 해석하려고 시도하므로 어떻게 든 선행 대시를 두 번 대시 또는 ./ 나머지 이름
chris

'.'에서 찾기 때문에 찾기가 자동으로 앞에 붙습니다. 전달 된 파일 이름은 './-A'이거나 파일 앞에 ./가 앞에 붙고 명령에 대해 올바르게 이스케이프됩니다.
baumgart

Nit : -exec이름을 이탈하지 않아도되며 필요하지 않습니다. exec*syscall 중 하나를 통해 전달 된 인수 는 실제 이름입니다. 쉘이 올바른 (따옴표없이) 실제 이름을 전달하도록 인용 된 공간 세미콜론 별표와 같은 특수 문자가 필요한 입력 만 입니다. 즉, find -exec rm -f {}이 Q에 대해 요청 된 디렉토리가 아닌 파일에 대해서만 작동합니다. find -exec rm -rf {}디렉토리와 비어 있지 않은 디렉토리를 처리하지만 건너 뛰고 find수행하는 rm -rf ./-A것이 훨씬 간단합니다.
dave_thompson_085

0

find는 다음과 같은 방법으로 디렉토리를 삭제할 수 있습니다.

find . -type d -iname '-A' -delete

-1

라는 디렉토리를 삭제하려고했습니다 -p. @Moo의 대답은 내가 할 수 없었던 일을 달성 rm ./-p했으며 Google 검색 후 많은 웹 페이지에서 광범위하게 사용할 수 있습니다.

또 다른 방법은 inode 번호를 사용하는 것입니다. 여기에 설명 된 방법을 사용했습니다.

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

간단히 말해 다음 명령을 사용하십시오.

  1. 파일 또는 디렉토리 inode 번호를 표시합니다.
ls -il
  1. 파일 또는 디렉토리에 인수를 사용하여 find명령을 사용하십시오 .-exec rm -irf-exec rm -ifdr
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

-f플래그 내에서 사용해야합니다 . 그렇지 않으면 bash는 디렉토리 나 파일을 찾을 수 없다는 불만을 표시합니다.

에 테스트 :

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
이것은 10 년 전의 baumgart의 답변과 거의 동일하지만 호출 할 때 rm -d항상 필요 하지는 않지만 디렉토리 가 필요 하고 파일 에는 필요 하지 않습니다 . 수정 된 경우에도이 방법은 여전히 ​​서투르고 열등합니다. 비어 있지 않은 디렉토리 의 경우, 디렉토리의 경우 r이고 권한 설정에 따라 f입니다. -ffind-rrm -fr ./-p
dave_thompson_085

1
두 방법 모두 이전 답변에서 이미 언급되었습니다.
RalfFriedl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.