찾기 -exec + 대 찾기 | xargs: 어느 것을 선택할 것인가?

찾기 -exec + 대 찾기 | 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은 단지 인기 있는 예일 뿐입니다.

그리고 참고하세요.찾기 -exec다음과 같은 다른 찾기 명령을 사용하여-ls또는-삭제또는 비슷한 것. 삭제는 rm(파일 제거)뿐만 아니라 rmdir(디렉토리 제거)도 수행한다는 점에 유의하세요.

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

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

발견물에 대한 마스킹이 필요하다고 생각되는 경우{} 중괄호, 증거를 요구하는 내 질문을 자유롭게 방문하십시오. 내 주장은: 당신은 그렇지 않습니다.

답변3

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

using의 가장 큰 장점은 를 사용 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 …왜냐하면 find는 다른 프로세스이고 파이프 버퍼가 가득 찰 때까지 계속 실행되기 때문입니다.

(포맷은 제가 했습니다.)

그래서 그게 있습니다. 그러나 성능이 정말로 중요하다면 현실적인 벤치마킹을 수행해야 하거나 오히려 그러한 경우에 쉘을 사용할 것인지 스스로에게 물어봐야 합니다.

-exec … +여기 이 사이트에서는 양식이 더 간단하고 여기의 다른 답변에서 언급된 이유(예: 많이 생각할 필요 없이 이상한 파일 이름 처리) 때문에 가능할 때마다 양식을 사용하도록 사람들에게 조언하는 것이 더 낫다고 생각합니다 .

관련 정보