나는 달렸다
/bin/find /home/user/myfiles \! -name '.htaccess' -exec rm -r {} \;
그것은 모든 것을 삭제합니다존재하다 myfiles
디렉토리 myfiles
자체가 .htaccess
존재하지 않는 경우.
내가 기대하는 것은 디렉터리에서 파일( .htacess
모든 파일 제외)을 찾아 삭제한다는 것입니다.
내가 뭘 잘못했나요?
답변1
귀하의 버전이 및 (GNU , macOS Monterey 또는 기타 버전) 을 find
지원 하는 경우 다음을 사용할 수 있습니다.-delete
-mindepth
find
/bin/find /home/user/myfiles -mindepth 1 -delete
다른 것이라면 find
다음과 같이 경로를 지정해 보겠습니다.
/bin/find /home/user/myfiles/*
유지하려는 디렉토리 아래의 모든 항목을 병합한 다음 find
그 아래에서 작업을 수행합니다.
이는 단순히 항목을 나열하거나 삭제하기 전에 삭제하는 등 비파괴적인 방식으로 먼저 실행하기 위해 기본적으로 자체 작업 매개 변수를 검색하는 find와 같은 도구에 좋은 아이디어입니다.
답변2
find
시작 디렉터리 자체에서 검색을 시작합니다. 즉, 만약 당신이
foo/
a
b
당신은 달리다
find foo
당신은 얻을 것이다
foo
foo/a
foo/b
따라서 이렇게 하면 -exec rm -r {} \;
시작 디렉터리도 삭제됩니다. 당신이 할 수 있는 일은 find
시작 디렉터리를 포함하지 않도록 지시하는 것입니다:
find /home/user/myfiles ! -path /home/user/myfiles -exec rm -r {} \;
답변3
다니엘 워커의 답변명령에 무슨 일이 일어나고 있는지와 이를 해결하는 한 가지 방법을 설명합니다(Stéphane Chazelas가 다른 옵션을 제공합니다)댓글에서). 사용법을 알아두시면 좋습니다 find
. 그러나 Bash를 사용하는 경우 이 특정 작업을 수행하는 또 다른 방법은 다음과 같습니다.
(shopt -s dotglob && cd /home/user/myfiles && rm -r -- *)
해당 기능이 내장되어 있으므로 find
재귀 삭제를 수행 할 필요가 없습니다 .rm
답변4
재귀적으로 삭제하라고 지시하지만 /home/user/myfiles/
/home/user/myfiles/a
/home/user/myfiles/b
삭제하라고 지시하지는 않습니다 /home/user/myfiles/c
. 그러나 재귀적으로 삭제하도록 지시하는 것만으로도 /home/user/myfiles/
모든 것을 삭제하기에 충분합니다.
제외(of find
)는 삭제하지 말라고 말하지 않습니다. rm
이에 대해 command( )에게 말하지 말라는 내용이 있습니다 .