it-swarm.dev

찾기-exec rm vs -delete

이 두 명령의 차이점을 이해하려고합니다.

Sudo find / -name .DS_Store -delete

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

execmethod가 선호됩니다. 왜? 어느 것이 더 안전하고 빠르거나 더 낫습니까? Macbook 둘 다 사용했는데 모든 것이 잘 작동하는 것 같습니다.

295
Onion

-delete는 일치하는 모든 파일에 대해 외부 프로세스를 생성 할 필요가 없기 때문에 성능이 향상됩니다.

-exec rm {} \;가 모든 버전의 find에 존재하지 않기 때문에 -delete가 권장되는 경우가 종종 있습니다. 지금 확인할 수는 없지만 find를 사용하지 않았습니다.

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

@doitmyway의 코멘트 당 EDIT : 이름과 다음에 일치하는지 확인하십시오 다른 방법으로 삭제하지 마십시오 (삭제 후 일치). 그렇지 않으면 모든 파일이 일치하는지 여부에 관계없이 삭제됩니다 . 즉, 하지 말 것이 작업을 수행하십시오 : find / -delete -name .DS_Store.

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

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

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

280
Celada

.DS_Store가 디렉토리가 아닌 파일을 나타내면 가장 이식성이 뛰어난 방법은 다음과 같습니다.

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

유일한 위험은 Sudo을 사용할 수 없지만 현재는 상당히 낮습니다.

GNU 찾기를 요구하는 데 사용되는 -delete 옵션은 다른 많은 find 구현에서 여전히 표준이 아니므로 항상 사용 가능한 것은 아닙니다.

+ 대신 명령 종료 \;는에있는 각각의 모든 .DS_Store에 대해 exec 명령을 실행하지 않음으로써 rm 절을 고도로 최적화합니다. 파일 시스템.

30
jlliagre

맥북과 같은 컴퓨터의 경우 두 명령의 성능에 큰 차이가 없습니다. 그러나 -exec 버전을 보면 미묘한 차이가 있습니다.

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

즉, ".file-to-delete"라는 이름의 모든 파일을 찾을 수 있습니다. 그러나이 검색은 원하지 않는 오 탐지를 반환 할 수 있습니다. Sudo로 무언가를 할 때는 좀 더 조심해야합니다. -exec rm {}을 사용하면 다음과 같이 인수를 rm에 전달할 수 있다는 장점이 있습니다.

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

이 예에서는 emacs가 만든 백업 파일을 제거하고 싶습니다. 그러나 그 물결표는 내가 알지 못하고 중요 할 수있는 모호한 파일에있을 수 있습니다. 또한 삭제를 확인하고 싶습니다. 그래서 rm 명령에 '-i'옵션을 넣었습니다. 대화식으로 삭제됩니다.

또한 rm뿐만 아니라 디렉토리와 파일을 삭제하는 사용법을 세분화 할 수 있습니다.

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

간단히 말해서 -exec는 찾은 항목을 제거하는 실제 명령을 조금 더 제어합니다. 장점은 한 도구를 사용하여 파일을 찾고 다른 도구를 사용하여 파일을 제거한다는 것입니다. 또한 찾기 유틸리티의 모든 버전에 -delete 옵션이있는 것은 아닙니다. 따라서 올바른 작업을 위해 각 도구를 사용하는 것이 좋습니다. 이것이 유닉스 철학입니다. 하나의 도구, 하나의 작업, 필요한 도구를 함께 사용하여 수행하십시오.

17
Fr. John Jenkins