저는 이들의 차이점을 이해하려고합니다. 두 개의 명령 :
sudo find / -name .DS_Store -delete
및
sudo find / -name ".DS_Store" -exec rm {} \;
-exec ... {}
방법이 선호됩니다. 그 이유는 무엇입니까? 어느 것이 더 안전하고 / 빠르며 / 더 나은가요? Macbook 에서 둘 다 사용했는데 모든 것이 잘 작동하는 것 같습니다.
Answer
-delete
는 각각에 대해 외부 프로세스를 생성 할 필요가 없기 때문에 더 나은 성능을 발휘합니다. 및 일치하는 모든 파일.
-delete
가 존재하지 않기 때문에 -exec rm {} \;
가 자주 권장되는 것을 볼 수 있습니다. find
의 모든 버전입니다. 지금은 확인할 수 없지만이 파일 없이는 find
를 사용했다고 확신합니다.
B 다른 방법은 “안전”해야합니다.
@doitmyway의 댓글 당 편집 : 일치하는지 확인하세요. 이름에 입력하고 그런 다음 삭제합니다. 그 반대는 아닙니다 (삭제 후 일치). 그렇지 않으면 일치 여부에 관계없이 모든 파일이 삭제됩니다 . 즉, 하지 마십시오 : find / -delete -name .DS_Store
.
일치하는 각 파일에 대해 외부 프로세스를 생성하는 오버 헤드를 피하는 일반적인 방법은 다음과 같습니다.
find / -name .DS_Store -print0 | xargs -0 rm
(하지만 여기에도 이식성 문제가 있습니다. 모든 버전의 find에 -print0
!)
댓글
또는 <
및“및 따옴표가없는 한 셸에 특별한 의미가있는 다른 많은 것.
xargs
는 제한된 크기의 인수 목록 문제를 여러 명령 호출로 분할하여 투명하게 처리합니다. Answer
.DS_Store
가 디렉토리가 아니라 파일을 나타낸다고 가정 할 때 가장 이식 가능한 가장 빠른 방법은 다음과 같습니다.
sudo find / -name .DS_Store -exec rm {} +
유일한 위험은 sudo
를 사용할 수 없다는 것입니다.하지만 요즘은 상당히 낮습니다.
-delete
옵션은 GNU 찾기를 요구하는 데 사용되며 다른 많은 find
구현에서는 여전히 표준이 아니므로 항상 사용할 수있는 것은 아닙니다.
명령 종료 +
in \;
대신 exec
절을 각각에 대해 rm
명령을 실행하지 않음으로써 파일 시스템에있는 모든 .DS_Store
답변
당신의 맥북으로서 당신은 두 명령 사이의 성능에서 큰 차이를 찾지 못할 것입니다. 그러나 -exec 버전을 살펴보면 미묘한 차이를 볼 수 있습니다.
sudo find / -iname ".file-to-delete" -exec rm {} \;
이것은 이름이 “.file 인 모든 파일을 찾을 수 있음을 의미합니다. -지우는 것”. 그러나이 검색은 원치 않는 오 탐지를 반환 할 수 있습니다. 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 옵션이있는 것은 아닙니다. 따라서 적절한 작업을 위해 각 도구를 사용하는 것이 좋습니다. 이것이 유닉스 철학입니다. 하나의 도구, 하나의 작업으로 필요한 작업을 함께 사용합니다.
댓글
- iv 참조 대화식 확인을 위해
-exec rm {} \;
대신 id = “ecc4fb1268″>
.
-delete
스위치를 사용하여-name
지정된 파일 트리를 삭제한다는 것을 읽었습니다. 이므로주의해야합니다.find
에서는-exec rm {} +
를 사용하여 일치하는 항목을 모두 제거 할 수 있습니다. 단일rm
명령이있는 파일..DS_Store
는 ' 특수 문자가 전혀 포함되어 있지 않으므로 따옴표가 필요하지 않으며이 경우에는 아무것도 변경하지 않습니다.;
또는|
또는>
모든 셸 메타 문자에 대해 걱정해야합니다.