"찾기" 출력을 기반으로 디렉터리를 삭제하는 방법은 무엇입니까?

"찾기" 출력을 기반으로 디렉터리를 삭제하는 방법은 무엇입니까?

.svn 디렉터리를 찾으려면 다음 명령을 실행합니다.

find . -name ".svn"

이는 나에게 다음과 같은 결과를 제공합니다.

./toto/.svn
./toto/titi/.svn
./toto/tata/.svn

rm -fr디렉토리와 그 내용을 삭제 하려면 이 모든 줄을 어떻게 처리해야 합니까 ?

답변1

Find는 -exec찾은 각 일치 항목에 대한 옵션이 포함된 인수를 실행할 수 있습니다. 공백/줄 바꿈 및 기타 문자가 포함된 경로를 올바르게 처리할 수 있으므로 이는 권장되는 메커니즘입니다. 디렉터리 자체를 삭제하려면 먼저 디렉터리의 내용을 삭제해야 하므로 이를 수행하려면 -r명령을 사용하십시오.rm

귀하의 예를 들어 다음을 발행할 수 있습니다.

find . -name ".svn" -exec rm -r "{}" \;

find에게만 find라고 말할 수도 있습니다.목차확인을 추가하여 -type d이름을 .svn으로 지정합니다 .

find . -name ".svn" -type d -exec rm -r "{}" \;

경고하다rm -r주의해서 사용하면 폴더와 해당 내용이 모두 삭제됩니다.

빈 디렉토리와 빈 디렉토리만 포함된 디렉토리만 삭제하려면 -deletefind 및 다음을 사용하여 직접 삭제할 수 있습니다 -empty.

find . -name ".svn" -type d -empty -delete

답변2

허용되는 답변보다 빠르고 이식 가능한 방법이 있습니다.

명령 종결 +자로 세미콜론 대신 a를 사용하면 CPU 사용량을 최적화할 수 있습니다. 하위 디렉터리가 find많은 경우 이는 중요할 수 있습니다 .svn.

find . -name .svn -type d -exec rm -rf {} +

또한 여기서는 중괄호를 인용할 필요 가 없습니다.

1 쉘을 사용하지 않는 한 fish(이 답변을 작성한 이후 수정되었을 수 있습니다).

답변3

당신이 사용하고 있다고 가정그누 찾기, 다음과 같은 옵션이 있습니다 -delete.

find . -name test -delete

이것은 기억하기 더 쉽습니다.

답변4

내 컴퓨터에서 다음을 사용할 때:

find . \( -name dirname -type d \) -exec rm -r '{}' ';'

디렉터리가 삭제되었지만 오류가 발생했습니다.

find: ‘./dirname’: No such file or directory

각 디렉토리마다.

내 디렉토리가 비어 있지 않으므로 -delete 옵션이 작동하지 않습니다. 이 행동의 이유를 찾았습니다여기:

  1. find는 (반드시 그런 것은 아님) ./ 디렉토리의 첫 번째 항목을 가져옵니다. 예를 들어 dir.1/
  2. "dir.?" 패턴과 비교합니다. 성냥? 예.
  3. find는 "rm -r dir.1"을 실행합니다.
  4. find는 디렉토리에서 패턴을 찾기 위해 dir.1/을 입력하려고 시도합니다. exec 명령에 대해서는 아무것도 모릅니다.
  5. 더 이상 dir.1/을 찾을 수 없습니다. ENOENT를 반환합니다(strace 출력 참조).

나는 이것을 해결하기 위해 다음을 사용했습니다.

rm -r `find . -name dirname -type d`

find는 여전히 dirname이라는 디렉토리로 재귀를 시도하지만 이는 실제로 필요하지 않으며 추가 시간이 소요된다는 점을 명심하십시오. 디렉토리 구조에 따라 --depth찾기 옵션을 사용하여 이 문제를 해결할 수 있습니다 . 또한 dirname/foo/dirname과 같은 디렉토리 구조가 있는 경우 rm에서 "해당 파일 또는 디렉토리가 없습니다" 오류가 발생합니다. 오류를 억제하려면 stderr을 /dev/null로 리디렉션하거나 -frm(force) 플래그를 사용할 수 있습니다.

관련 정보