필자의 실수로 (예를 들어) -A라는 디렉토리를 실수로 만들어 파일로 채웠습니다.
해당 디렉토리를 삭제하고 싶습니다. 난 노력 했어:
rmdir -- -A
그러나 디렉토리에 여전히 파일이 있음을 알려줍니다. 그리고 나는 디렉토리로 들어가서 해당 파일을 삭제하는 방법을 알 수 없습니다.
이 성가신 디렉토리를 제거하려면 어떻게해야합니까?
필자의 실수로 (예를 들어) -A라는 디렉토리를 실수로 만들어 파일로 채웠습니다.
해당 디렉토리를 삭제하고 싶습니다. 난 노력 했어:
rmdir -- -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 ..
$ 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 ..
파일 앞에 ./를 넣을 수 있습니다. 이렇게하면 파일 이름이 옵션 플래그 인 것처럼 rm 또는 rmdir이 동작하지 않습니다.
또한 옵션을 발행 할 수 있습니다.이 옵션을 사용하면 rm 이후의 모든 것이 마치 파일 이름처럼 작동하고 더 이상 옵션을 처리하지 않아야합니다. 요즘에는 골동품 유닉스 동물원이 아주 작아서 펑키 한 RM 버전이있을 수 있습니다.
어쨌든 삭제할 때 이름 앞에 ./를 두는 습관을 가져야합니다. 디렉토리에 -r 또는 -rf라는 이름의 파일이 있는지 알 수 없습니다. 당신은 항상 ---를 사용해야한다고 말할 수 있지만 ./는 더 자연 스럽습니다. "*이 디렉토리에서 파일을 삭제하고 싶습니다.
rmdir은 내부에 아무 것도없는 디렉토리를 삭제하지 않습니다. "rm -rf"가됩니다. rmdir은 "rm -rf"보다 훨씬 안전합니다. 무의 대답은 여전히 최고 일 것입니다.
다른 방법은 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$
-exec
이름을 이탈하지 않아도되며 필요하지 않습니다. exec*
syscall 중 하나를 통해 전달 된 인수 는 실제 이름입니다. 쉘이 올바른 (따옴표없이) 실제 이름을 전달하도록 인용 된 공간 세미콜론 별표와 같은 특수 문자가 필요한 쉘 입력 만 입니다. 즉, find -exec rm -f {}
이 Q에 대해 요청 된 디렉토리가 아닌 파일에 대해서만 작동합니다. find -exec rm -rf {}
디렉토리와 비어 있지 않은 디렉토리를 처리하지만 건너 뛰고 find
수행하는 rm -rf ./-A
것이 훨씬 간단합니다.
라는 디렉토리를 삭제하려고했습니다 -p
. @Moo의 대답은 내가 할 수 없었던 일을 달성 rm ./-p
했으며 Google 검색 후 많은 웹 페이지에서 광범위하게 사용할 수 있습니다.
또 다른 방법은 inode 번호를 사용하는 것입니다. 여기에 설명 된 방법을 사용했습니다.
https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html
간단히 말해 다음 명령을 사용하십시오.
ls -il
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
rm -d
항상 필요 하지는 않지만 디렉토리 가 필요 하고 파일 에는 필요 하지 않습니다 . 수정 된 경우에도이 방법은 여전히 서투르고 열등합니다. 비어 있지 않은 디렉토리 의 경우, 디렉토리의 경우 r이고 권한 설정에 따라 f입니다. -f
find
-r
rm -fr ./-p