찾기-exec rm vs -delete


260

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

sudo find / -name .DS_Store -delete

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

나는 그 exec방법이 선호 된다는 것을 알아 차렸다 . 왜? 어느 것이 더 안전하고 빠르거나 더 낫습니까? Macbook에서 모두 사용했는데 모든 것이 잘 작동하는 것 같습니다.

답변:


245

-delete 일치하는 모든 파일에 대해 외부 프로세스를 생성하지 않아도되므로 성능이 향상됩니다.

의 모든 버전에이 (가) 존재하지 않기 -exec rm {} \;때문에 권장되는 경우가 종종 있습니다 . 나는 지금 확인할 수는 없지만 그것을 사용하지 않았다고 확신 합니다.-deletefindfind

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

@doitmyway의 의견 당 편집 : 이름을 일치시킨 다음 다른 방법으로 삭제하지 마십시오 (삭제, 일치). 그렇지 않으면 일치 여부에 관계없이 모든 파일이 삭제됩니다 . 즉, 이렇게 하지 마십시오 : find / -delete -name .DS_Store.

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

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

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


2
내가 참조. 또한 지정된 파일 트리 -delete-name삭제 하기 전에 스위치 를 사용하면 읽었 으므로주의해야한다고 생각합니다.
양파

8
최근 에는 단일 명령으로 일치하는 모든 파일을 제거 find하는 -exec rm {} +데 사용할 수 있습니다 rm.
jimmij

3
.DS_Store특수 문자를 전혀 포함하지 않으므로 따옴표는 불필요 하며이 경우에는 아무것도 변경하지 않습니다.
Celada

1
기본적으로 공백 (탭, 탭 등)만이 인용 부호가없는 문자열을 두 개의 별도 명령 줄 인수로 해석하게하는 유일한 방법이지만 인용 여부를 결정할 때 유감스럽게 생각할 필요는 없습니다. 당신은 걱정할 필요가 모든 같은 쉘 메타 문자 ;|또는 ><하고``와 인용하지 않는 쉘에 특별한 의미를 갖는 많은 다른 사람.
Celada

1
@MarcoMarsala xargs는 제한된 크기의 인수 목록 문제를 명령을 여러 번 호출하여 투명하게 처리합니다.
Celada

27

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

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

유일하게 위험을 감수 sudo할 수는 없지만 현재는 상당히 낮습니다.

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

파일 시스템에 존재하는 모든 명령을 실행하지 +않고 명령 종료 대신 절을 \;최적화합니다 .execrm.DS_Store


16

맥북과 같은 컴퓨터의 경우 두 명령의 성능에 큰 차이가 없습니다. 그러나 -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 옵션이있는 것은 아닙니다. 따라서 적절한 작업을 위해 각 도구를 사용하는 것이 좋습니다. 이것이 유닉스 철학입니다. 하나의 도구, 하나의 작업, 필요한 것을하기 위해 함께 사용하십시오.


3
대화식 확인 -ok rm {} \;대신 참조하십시오 -exec rm {} \;.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.