"-exec rm {} \;" 및 "-delete"를 찾습니다.

"-exec rm {} \;" 및 "-delete"를 찾습니다.

이 두 명령의 차이점을 이해하려고 노력하고 있습니다.

find / -name .DS_Store -delete

그리고

find / -name ".DS_Store" -exec rm {} \;

-exec ... {}이 방법이 선호되는 것으로 나타났습니다 . 왜? 어느 것이 더 안전하고/빠르고/더 좋나요? 내꺼엔 둘 다 써봤어맥북모든 것이 잘 작동하는 것 같습니다.

답변1

-delete일치하는 각 파일에 대해 외부 프로세스를 생성할 필요가 없기 때문에 성능이 더 좋지만확실하게 하다이 옵션을 호출하세요뒤쪽에필터 기준(예: -name, -cmin-type). 그렇지 않으면 지정된 전체 파일 트리가 삭제됩니다. 실제로 find맨페이지를 인용하자면 다음과 같습니다.

GNU find는 결과가 알려질 때까지 주어진 표현식을 왼쪽에서 오른쪽으로 평가하여 우선 순위 규칙(연산자 섹션 참조)에 따라 주어진 각 시작 지점에 루트가 있는 디렉토리 트리를 검색합니다.

예를 들어,

find . -name .DS_Store -type f -delete

괜찮을 것입니다.

모든 버전에 존재하는 것은 아니기 -exec rm {} +때문에 권장 사항을 자주 볼 수 있습니다 . 지금은 확인할 수 없지만, 없이 사용해본 것은 확실합니다 .-deletefindfind

두 방법 모두 "안전"해야 합니다.

일치하는 각 파일에 대해 외부 프로세스를 생성하는 오버헤드를 방지하는 일반적인 방법은 다음과 같습니다.

find / -name .DS_Store -print0 | xargs -0 rm

(그러나 여기에도 이식성 문제가 있다는 점에 유의하십시오. find의 모든 버전에 이식성이 있는 것은 아닙니다 -print0!)

답변2

디렉토리가 아닌 파일을 나타낸다고 가정하면 .DS_Store가장 이식 가능하고 여전히 빠른 방법은 다음과 같습니다.

sudo find / -name .DS_Store -exec rm {} +

유일한 위험은 sudo그것을 사용할 수 없다는 것이지만 지금은 그 위험이 낮습니다.

-delete옵션은 FreeBSD 이상이 필요한 GNU 조회에 사용되며 find일부 다른 구현에서는 여전히 비표준이므로 항상 사용할 수 있는 것은 아닙니다.

명령 종료는 +파일 시스템의 모든 존재에 대해 명령을 실행하지 않으므로 \;고도로 최적화된 조항 이 아닙니다. 이는 보다 일반적이며 POSIX에 의해 지정됩니다.execrm.DS_Store

답변3

MacBook과 같은 시스템의 경우 이 두 명령 간에 성능 차이가 크지 않습니다. 그러나 버전을 살펴보면 -exec미묘한 차이점을 발견할 수 있습니다.

sudo find / -iname ".file-to-delete"  -exec rm {} \;

이는 이름이 .인 모든 파일을 찾을 수 있음을 의미합니다 .file-to-delete. 그러나 이 검색에서는 원치 않는 오탐지가 반환될 수 있습니다. 당신과 뭔가를 할 때는 sudo좀 더 조심해야겠어요 . 사용의 장점 은 다음과 같은 매개변수를 전달할 -exec rm {}수 있다는 것입니다 rm.

sudo find / -iname "*~"  -exec rm -i {} \;

이 예에서는 해당 백업 파일을 삭제하고 싶습니다 emacs. 그러나 해당 물결표는 내가 모르는 일부 모호한 파일에 있을 수 있지만 중요할 수 있습니다. 또한 삭제를 확인하고 싶습니다. 그래서 이 옵션을 명령 -i에 넣었습니다 rm. 이렇게 하면 대화형 삭제가 제공됩니다.

rm디렉터리 및 파일 삭제에 대한 사용량을 최적화할 수도 있습니다.

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

즉, -exec발견된 항목을 삭제하는 실제 명령을 더 효과적으로 제어할 수 있습니다. 장점은 하나의 도구를 사용하여 파일을 찾고 다른 도구를 사용하여 파일을 삭제할 수 있다는 것입니다. 또한 찾기 유틸리티의 모든 버전에 이 -delete옵션이 있는 것은 아닙니다. 따라서 올바른 작업에 각 도구를 사용하는 것이 가장 좋습니다. 이것이 Unix 철학입니다. 하나의 도구, 하나의 작업을 함께 사용하여 필요한 작업을 수행합니다.

답변4

기존 답변 외에 -delete디렉토리가 비어있지 않으면 삭제되지 않으니 주의하시기 바랍니다. 따라서 -exec rm -r이러한 경우에는 필요합니다.

예를 들어 다음은 작동하지 않습니다.

$ find . -type d -name ".TemporaryItems" -delete
find: cannot delete ‘./.TemporaryItems’: Directory not empty

그래서 당신은 이것이 필요합니다 :

find . -type d -name ".TemporaryItems" -exec rm -rv "{}" +

이 예에서는 -vrm에 (--verbose) 옵션을 추가합니다.

관련 정보