`find`는 최상위 디렉터리와 그 내용을 삭제합니다.

`find`는 최상위 디렉터리와 그 내용을 삭제합니다.

나는 달렸다

/bin/find /home/user/myfiles \! -name '.htaccess' -exec rm -r {} \;

그것은 모든 것을 삭제합니다존재하다 myfiles디렉토리 myfiles자체가 .htaccess존재하지 않는 경우.

내가 기대하는 것은 디렉터리에서 파일( .htacess모든 파일 제외)을 찾아 삭제한다는 것입니다.

내가 뭘 잘못했나요?

답변1

귀하의 버전이 및 (GNU , macOS Monterey 또는 기타 버전) 을 find지원 하는 경우 다음을 사용할 수 있습니다.-delete-mindepthfind

/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( )에게 말하지 말라는 내용이 있습니다 .

관련 정보