이 두 명령의 차이점을 이해하려고 노력하고 있습니다.
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 {} +
때문에 권장 사항을 자주 볼 수 있습니다 . 지금은 확인할 수 없지만, 없이 사용해본 것은 확실합니다 .-delete
find
find
두 방법 모두 "안전"해야 합니다.
일치하는 각 파일에 대해 외부 프로세스를 생성하는 오버헤드를 방지하는 일반적인 방법은 다음과 같습니다.
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에 의해 지정됩니다.exec
rm
.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 "{}" +
이 예에서는 -v
rm에 (--verbose) 옵션을 추가합니다.