-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 ". ' -exec 작업 방식은 xargs -P4 4 개 코어 중 3 개가 유휴 상태로 유지되지 않도록 '?
  • @DamianYerrick :

    ; "이지만 + (/ 더하기 기호)가 있습니다.

답변

파일 이름을 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 외에도 GNU xargs는 입력이없는 경우 명령을 실행하지 않으려면 -r이 필요합니다. '
  • | xargs -r0 cmd의 또 다른 문제는 cmd '의 표준 입력입니다. 영향을받습니다 (xargs 구현에 따라 ' s /dev/null 또는 파이프.

답변

-exec ... ; 양식을 사용하는 경우 ( 세미콜론을 이스케이프하려면 “파일 이름 당 한 번씩 명령을 실행합니다. -print0 | xargs -0를 사용하는 경우 파일 이름 당 여러 명령을 실행합니다. 반드시 형식 : 단일 명령 줄에 여러 파일을 배치하고 많은 파일이 관련 될 때 훨씬 더 빠릅니다.

xargsxargs -P를 사용하여 여러 명령을 병렬로 실행할 수있는 기능입니다. 멀티 코어 시스템에서 엄청난 시간을 절약 할 수 있습니다.

댓글

  • -P

대신

. xargs -P는 POSIX 표준이 아닌 반면 find -exec {} +는 이식성을 추구하는 경우 중요합니다.

  • @Alexios 셸에 특별한 의미가 없기 때문에 ' 더하기 기호를 이스케이프 할 필요가 없습니다. find /tmp/ -exec ls "{}" +는 잘 작동합니다.
  • 물론, 초급입니다. 저는 ' -exec 이후의 모든 것을 너무 오랫동안 이스케이프했습니다 (저 ' masochist , 저는 ' {}를 이스케이프하기 위해 따옴표를 사용하지 않으며 항상 \{\}를 입력합니다. ' 묻지 않음), 모든 것이 지금 이스케이프되어야하는 것처럼 보입니다.
  • @Alexios : 예를 발견하면 (매조 히 스트가되는 것 제외) 중괄호를 마스킹하는 것이 유용합니다. 여기에 내 질문에 대한 답변 으로 제공하십시오.이 힌트는 구식이며 맨 페이지의 유물 일뿐입니다. 저는 ' find /tmp/ -exec ls {} +가 작동하지 않는 ' 예를 본 적이 없습니다.
  • 저에게 이것은 SunOS 4 시대에 형성된 근육 기억입니다. ' 몇 년 동안 해왔 기 때문에 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 … + 양식을 사용하십시오. 그 이유는 더 간단하고 여기 다른 답변에서 언급 한 이유 때문입니다 (예 : 많은 생각없이 이상한 파일 이름 처리).

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다