find -exec + vs find xargs: 어느 것을 선택할 것인가?

find -exec + vs find xargs: 어느 것을 선택할 것인가?

나는 내가 모방 -exec할 수 있는 행동이 있다는 것을 알고 있습니다 . 한 가지 형태를 다른 것보다 선호하는 상황이 있습니까?+xargs

나는 개인적으로 파이프 사용을 피하기 위해 첫 번째 형식을 선호합니다. 개발자들이 find적절한 최적화를 했음에 틀림없다고 생각합니다 . 내가 맞나요?

답변1

파일 이름을 안전하게 파이핑 xargs하려면 find해당 -print0옵션을 지원하고 xargs이를 읽을 수 있는 해당 옵션( --null또는 -0)이 있어야 합니다. 그렇지 않으면 이름에 인쇄할 수 없는 문자, 백슬래시, 따옴표 또는 공백이 포함된 파일 이름으로 인해 예기치 않은 동작이 발생할 수 있습니다. 반면에 find -exec {} +그것은POSIX find사양이므로 이식 가능하고 와 마찬가지로 안전하며 find -print0 | xargs -0보다 확실히 더 안전 합니다 find | xargs. 나는 추천하고 싶다안 돼요find | xargs하지 않았다 -print0.

답변2

알아보기 위해 통화를 연결하고 싶을 수도 있습니다(이것이 가능하다는 것을 알게 되었을 때 오늘은 그럴 수도 있습니다). 물론 이것은 계속해서 살펴보아야만 가능합니다. xargs로 파이프하면 범위를 벗어납니다.

작은 예, 두 개의 파일 a.lst 및 b.lst:

cat a.lst
fuddel.sh
fiddel.sh

cat b.lst
fuddel.sh

여기에는 트릭이 없습니다. 둘 다 "fuddel"을 포함하지만 하나만 "fiddel"을 포함한다는 사실입니다.

우리가 이것을 모른다고 가정해보자. 우리는 두 가지 기준을 충족하는 파일을 검색합니다.

find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097    4 -rw-r--r--   1 stefan   stefan         20 Jun 27 17:05 ./a.lst

글쎄요, 두 개의 문자열을 조건으로 전달하는 grep이나 다른 프로그램의 구문을 알고 있을 수도 있지만 그게 요점이 아닙니다. true 또는 false(파일을 인수로 제공)를 반환할 수 있는 모든 프로그램을 여기에서 사용할 수 있습니다. grep은 널리 사용되는 예일 뿐입니다.

따라가실 수 있으니 참고하세요찾기-실행다음과 같은 다른 찾기 명령과 함께 사용됩니다.-ls또는-삭제또는 그런 것. 삭제는 rm(파일 삭제) 작업뿐만 아니라 rmdir(디렉토리 삭제) 작업도 수행할 수 있습니다.

달리 지정하지 않는 한(즉, 스위치 -or(및 대괄호(마스킹 필요)) 사용) 이러한 체인은 명령의 AND 조합으로 읽혀집니다.

따라서 조회 체인을 떠나지 않는 것이 매우 편리합니다. -xargs를 사용하면 어떤 이점도 찾을 수 없습니다. 파일을 전달할 때 주의해야 하기 때문입니다. 이는 find가 수행할 필요가 없습니다. 각 파일을 단일 인수로 전달하는 것을 자동으로 처리합니다.

뭔가 가릴 필요가 있다고 생각되면{} 큰 괄호, 제 질문을 방문하여 증거를 요청하시기 바랍니다. 내 주장은: 당신은 모른다는 것입니다.

답변3

해당 형식을 사용하는 경우 -exec ... ;(세미콜론을 이스케이프해야 함) 명령은 파일 이름당 한 번 실행됩니다. 를 사용하면 -print0 | xargs -0파일 이름별로 여러 명령이 실행됩니다. 반드시 이 -exec +형식을 사용해야 합니다. 여러 파일을 하나의 명령줄에 넣고 많은 파일이 포함될 때 훨씬 더 빠릅니다.

사용의 가장 큰 장점 중 하나 xargs는 여러 명령을 병렬로 실행할 수 있다는 것입니다 xargs -P. 멀티 코어 시스템에서는 이렇게 하면 많은 시간을 절약할 수 있습니다.

답변4

-exec … +성능에 관해서는 모든 작업을 단일 도구로 수행하므로 이것이 더 좋을 것이라고 생각 하지만GNU findutil 문서의 일부-exec … +어떤 경우에는 효율성이 떨어질 수 있다고 말했습니다 .

[ 로 찾기 -exec … +]xargs예를 들어 xargs이전 명령이 계속 실행되는 동안 새 명령줄을 구성할 수 있도록 허용하고 여러 명령을 병렬로 실행할 수 있도록 허용하는 등 일부 용도보다 효율성이 떨어질 수 있습니다 . 그러나 이 find ... -exec ... +구조는 이식성이 넓다는 장점이 있습니다. GNU findutils는 -exec ... +버전 4.2.12까지 ' '를 지원하지 않습니다.[2005년 1월];한 가지 이유는 -print0어쨌든 이미 " " 액션이 있기 때문입니다.

이게 무슨 뜻인지 잘 모르겠어서 채팅으로 물어봤습니다.드 로버트다음과 같이 해석됩니다.

find를 실행하는 동안 다음 파일 배치를 계속 검색하는 것이 가능할 수도 있지만 -exec … +그렇지 않습니다.
find … | xargs …조회는 다른 프로세스이고 파이프 버퍼가 가득 찰 때까지 실행되기 때문에 이는 사실입니다.

(직접 포맷했습니다.)

그래서 그게 다입니다. 그러나 성능이 정말로 중요한 경우에는 실제 벤치마크를 수행하거나 이러한 상황에서 셸을 사용할지 스스로에게 물어봐야 합니다.

이 사이트에서는 더 간단하고 여기의 다른 답변에서 언급된 이유(예: 너무 많이 생각하지 않고도 이상한 파일 이름을 처리할 수 있음)로 인해 가능할 때마다 해당 형식을 사용하도록 사람들에게 조언하는 것이 가장 좋다고 생각합니다 -exec … +.

관련 정보