-exec
가 +
옵션을 취할 수 있음을 이해합니다. xargs
의 동작을 모방합니다. 한 양식을 다른 양식보다 선호하는 상황이 있습니까?
개인적으로 파이프를 사용하지 않으려면 첫 번째 양식을 선호하는 경향이 있습니다. 나는 확실히 는”적절한 최적화를 수행해야합니다. 내가 맞습니까?
Answer
찾기를 위해 호출을 연결하는 것이 좋습니다 (한 번, , 오늘 일 수 있음). 물론 이것은 찾을 수있는 동안에 만 가능합니다. 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 또는 다른 프로그램이 두 문자열을 조건으로 전달하는 구문을 알고있을 수도 있습니다. 인수로 파일을 주면 참 또는 거짓을 반환 할 수있는 모든 프로그램을 여기서 사용할 수 있습니다. grep은 인기있는 예일뿐입니다.
그리고 find -exec 와 -ls 또는 -delete 또는 이와 유사한 것입니다. delete는 rm (파일 제거)뿐만 아니라 rmdir도 수행합니다. (디렉토리 제거)
이러한 체인은 달리 지정되지 않는 한 (즉, -or
스위치 (및 괄호 (마스킹이 필요함))).
따라서 찾기 체인을 떠나지 않는 것이 좋습니다. -xargs를 사용하는 데 어떤 이점도 보이지 않습니다. 파일을 전달할 때주의해야하므로 찾을 필요가 없습니다. 자동으로 각 파일을 단일 인수로 전달합니다.
{} 중괄호 를 찾기 위해 마스킹이 필요하다고 생각되면 증거를 요청하는 제 질문을 방문하십시오. 내 주장은 다음과 같습니다.
댓글
답변
파일 이름을 xargs
로 안전하게 파이핑하려면 find
가 -print0
옵션과 xargs
에는 해당 옵션을 읽을 수있는 옵션이 있습니다 (--null
또는 -0
). 그렇지 않으면 unprintab가있는 파일 이름 이름에 파일 문자, 백 슬래시, 따옴표 또는 공백이 있으면 예기치 않은 동작이 발생할 수 있습니다. 반면 find -exec {} +
는 POSIX find
사양 에 있습니다. , 따라서 휴대가 가능하고 find -print0 | xargs -0
만큼 안전하며 find | xargs
보다 확실히 안전합니다. -print0
없이는 find | xargs
을 절대 하지 않는 것이 좋습니다.
댓글
-
find … -exec … {} +
의 이식성에 대한 주목할만한 예외는 OpenBSD입니다. OpenBSD는 2012 년에 출시 된 버전 5.1에서만이 기능을 획득했습니다. 모든 BSD는-print0
몇 년 동안, 심지어 OpenBSD (한동안 그 기능에 저항했지만)까지도있었습니다. 반면에 Solaris는 POSIX 기능을 고수하므로 및-print0
는 없습니다. -
-print0
는 고통스럽고 논쟁 할 수 있지만xargs --delimiter "\n"
는 ' 동등하지 않습니다. 저는 ' 후자를 발견 한 후 전자를 사용한 적이 없습니다. . - '
-0
가 . -
-0
외에도 GNUxargs
는 입력이없는 경우 명령을 실행하지 않으려면-r
이 필요합니다. ' -
| xargs -r0 cmd
의 또 다른 문제는cmd
'의 표준 입력입니다. 영향을받습니다 (xargs
구현에 따라 ' s/dev/null
또는 파이프.
답변
-exec ... ;
양식을 사용하는 경우 ( 세미콜론을 이스케이프하려면 “파일 이름 당 한 번씩 명령을 실행합니다. -print0 | xargs -0
를 사용하는 경우 파일 이름 당 여러 명령을 실행합니다. 반드시 형식 : 단일 명령 줄에 여러 파일을 배치하고 많은 파일이 관련 될 때 훨씬 더 빠릅니다.
xargs
는 xargs -P
를 사용하여 여러 명령을 병렬로 실행할 수있는 기능입니다. 멀티 코어 시스템에서 엄청난 시간을 절약 할 수 있습니다.
댓글
-
-P
대신
. xargs -P
는 POSIX 표준이 아닌 반면 find -exec {} +
는 이식성을 추구하는 경우 중요합니다.
find /tmp/ -exec ls "{}" +
는 잘 작동합니다. -exec
이후의 모든 것을 너무 오랫동안 이스케이프했습니다 (저 ' masochist , 저는 ' {}
를 이스케이프하기 위해 따옴표를 사용하지 않으며 항상 \{\}
를 입력합니다. ' 묻지 않음), 모든 것이 지금 이스케이프되어야하는 것처럼 보입니다. find /tmp/ -exec ls {} +
가 작동하지 않는 ' 예를 본 적이 없습니다. bash
는 중괄호를 그대로 받아들이 기 시작했습니다. ' 중괄호가 없으면 ' 사용한 이전 셸 중 하나 이상이 히시 핏을 던졌습니다. ' 이스케이프되지 않았습니다. 답변
성능과 관련하여 -exec … +
는 “모든 작업을 수행하는 단일 도구이지만 GNU findutil”문서의 일부 에 -exec … +
는 경우에 따라 효율성이 떨어질 수 있습니다.
[] 는
xargs
의 일부 사용보다 효율성이 떨어질 수 있습니다. 예를 들어xargs
를 사용하면 이전 명령이 계속 실행되는 동안 새 명령 줄을 작성할 수 있으며 병렬로 실행할 여러 명령을 지정할 수 있습니다. 그러나find ... -exec ... +
구조는 광범위한 이식성의 장점이 있습니다. GNU findutils는 버전 4.2.12 [2005 년 1 월] 까지‘-exec ... +
’를 지원하지 않았습니다. 그 이유 중 하나는 어떤 경우에도 이미‘-print0
’작업이 있었기 때문입니다.
그게 무슨 뜻인지 정확히 알 수 없었기 때문에 채팅에서 derobert 는 다음과 같이 설명했습니다.
find
는 아마도 다음 배치 파일을 계속 검색 할 수 있습니다.-exec … +
는 실행 중이지만 실행되지는 않습니다.
find … | xargs …
는 실행합니다. 그러면 찾기가 다른 프로세스이므로 파이프 버퍼가 채워질 때까지 실행
(Formatting by me.)
그렇습니다. 그러나 성능이 정말로 중요하다면 현실적인 벤치마킹을 수행하거나 그러한 경우에 쉘을 사용할 것인지 스스로에게 물어봐야합니다.
이 사이트에서 사람들에게 조언하는 것이 더 낫다고 생각합니다. 가능하면 -exec … +
양식을 사용하십시오. 그 이유는 더 간단하고 여기 다른 답변에서 언급 한 이유 때문입니다 (예 : 많은 생각없이 이상한 파일 이름 처리).
-exec
작업 방식은xargs -P4
4 개 코어 중 3 개가 유휴 상태로 유지되지 않도록 '?; "이지만 + (/ 더하기 기호)가 있습니다.