Bash를 사용하여 숨겨진 파일과 디렉토리를 모두 삭제하는 방법은 무엇입니까?


28

확실한 솔루션은 종료 코드 1을 생성합니다.

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

하나의 가능한 해결책은 "."를 건너 뜁니다. 및 ".."디렉토리를 포함하지만 이름이 3자를 초과하는 파일 만 삭제합니다.

bash$ rm -f .??*

제거 할 수없는 것에 대해 너무 걱정하지 않는다면. & .. 그렇다면 누가 신경 쓰나요? 스크립트에서 추악한 출력에 대해 걱정하지 않으면 분명한 해결책은 다른 사람보다 솔직하게 타이핑하는 것이 적다고 생각합니다.
Matt

당신도 알다시피 .. 그리고. 파일이 아닙니다. 디렉토리에 대한 참조입니다. . (단일 도트)는 현재 디렉토리이고 .. (두 도트)는 디렉토리의 레벨을 한 단계 올립니다. 예를 들어, cd / home / user 인 경우. / home / user와 같고 ..은 / home /입니다. 즉,을 (를) 삭제할 수 없습니다. and .. (.?)
phuzion

주석에 감사드립니다. 나는 종종 명령 종료 코드 검사 (set -e)와 함께 스크립트에서 명령을 사용합니다. 이 경우 표시 종료 코드가 필요합니다.
Yonatan Broza

고유 한 것은 없습니다. .. rm -rf로 삭제되지 않도록 보호합니다. 이것은 rm의 최신 변형에 추가 된 보호 메커니즘 일뿐입니다.
kubanczyk 2009

그리고 항상 rm -rf가 있습니다. * || 해당 명령문에 대해 set -e 동작을 해결하려는 경우 true입니다.
도밍고 이그나시오 Galdos

답변:


34
rm -rf. [^.]. ?? *

모든 경우를 파악해야합니다. . ?? *는 3 개 이상의 문자 파일 이름과 일치하며 (이전 답변에서 설명한대로). [^.]은 두 개의 문자 항목 (.. 이외)을 포착합니다.


답변 해주셔서 감사합니다! 그것에 기초하여 나는 또한 "rm -rf. [^.] *"의 더 짧은 버전에 도착했다.
Yonatan Broza

4
더 짧은 버전을 조심하십시오. 비슷하지만 동일한 결과는 아닙니다. 앞면에 두 개의 점이있는 이름과 일치하지 않습니다 (예 : 루트킷 등을 숨기고있는 "... /")
Russell Heilling

그리고 PWD 확인을 조심하거나 모든 설정을 풀어야합니다. :)
kommradHomer

이것은 작동하지 않는 것 같습니다 zsh. 어떤 제안?
ryanjdillon

함께 zsh기본적으로 비어있는 와일드 카드 일치 오류로 처리됩니다; 반면 bash단순히 변경되지 않고 전달됩니다. zsh같은 방식으로 동작 하려면 명령을 사용할 수 있습니다unsetopt nomatch
Russell Heilling

1
find -path './.*' -delete

이것은 현재 디렉토리의 모든 파일과 일치하며 a로 시작하여 .재귀 적으로 삭제합니다. 숨겨지지 않은 디렉토리의 숨겨진 파일은 건드리지 않습니다.

디렉토리에서 모든 것을 지우고 싶다면 find -delete충분합니다.


이 항목은 다음 항목으로 시작하는 항목뿐만 아니라 모든 항목을 삭제합니다..
kasperd

오, "숨겨진 파일을 포함한 모든 것을 삭제합니다"라는 질문을 잘못 읽은 것 같습니다.
프리츠

@kasperd 감사합니다. 이제 질문에 실제로 답해야합니다.
프리츠

0

가장 좋은 방법은 아마도 :

  • 찾기 -iname. * -maxdepth 1-타입 f -exec rm {} \;

변경 RMLS는 -l 그냥 u는 추가 할 수 있습니다 출력 장황, 삭제 될 것입니다 무엇을보고 싶다면 -v 에 옵션 RM은

  • -type f 옵션은 find 명령이 파일 만 찾도록 지시 합니다 (dir, link 등 생략).
  • -maxdepth 1 지시 찾을 하위 디렉토리로 내려 가지 않는

추신. '\;'로 끝나는 것을 잊지 마십시오


1
꼼꼼한! 당신은 -iname '. *'또는 -iname. *을 의미합니다. 그리고 .. 어쨌든 다시.
도밍고 이그나시오 갈라 도스 2

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

파일 이름에 공백이있는 순간이 끊어집니다.
CVn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.