답변:
찾기 위해 전화를 연결하고 싶을 수도 있습니다 (한 번 배운 후에는 오늘 가능할 수도 있음). 물론 이것은 당신이 찾는 동안에 만 가능합니다. 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 또는 -delete 와 같은 다른 찾기 명령으로 find -exec 를 따를 수도 있습니다 . delete는 rm (파일 제거)뿐만 아니라 rmdir (디렉토리 제거)도 수행합니다.
이러한 체인은 달리 지정되지 않는 한 (즉, -or
스위치 (및 마스킹이 필요한 파엔)) 명령의 AND 조합으로 읽습니다 .
따라서 찾기 체인을 떠나지 않는 것이 편리합니다. -xargs를 사용할 때 어떤 이점도 얻지 못합니다. 파일을 전달할 때주의해야 할 필요가 없기 때문에 조심해야하므로 각 파일을 단일 인수로 전달하는 것이 자동으로 처리됩니다.
find {} 괄호에 대한 마스킹이 필요하다고 생각되면 증거를 요구하는 내 질문을 방문하십시오. 내 주장은 : 당신은하지 않습니다.
-exec
방법은 무엇입니까 xargs -P4
?
파일 이름을 안전하게 파이핑 xargs
하려면 옵션을 find
지원 하고 해당 옵션을 읽을 수있는 옵션 ( 또는 )이 있어야합니다 . 그렇지 않으면 이름에 인쇄 할 수없는 문자 나 백 슬래시 또는 따옴표 또는 공백이있는 파일 이름으로 인해 예기치 않은 동작이 발생할 수 있습니다. 반면에, 에 POSIX의 사양 은 휴대용 그래서, 그것은 안전 등에 관한 것입니다 , 그리고보다 확실히 안전합니다 . 내가 권하고 싶습니다 결코 일을하지 않고 .-print0
xargs
--null
-0
find -exec {} +
find
find -print0 | xargs -0
find | xargs
find | xargs
-print0
find … -exec … {} +
는 OpenBSD인데,이 기능은 2012 년에 릴리스 된 5.1 버전에서만이 기능을 획득했습니다. 모든 BSD는 -print0
수년 동안 OpenBSD를 포함 해 왔습니다. 당신이 얻을 수 있도록 솔라리스, 다른 한편으로는, POSIX에 스틱 기능을하지 -exec +
아니하고 -print0
.
-print0
고통스럽고 당신이 주장 할 수있는 xargs --delimiter "\n"
것은 아니지만, 나는 후자를 발견 한 후에 결코 이전을 사용한 적이 없다.
-0
것보다 고통이 더 많은 것을 보지 못한다 --delimiter "\n"
.
-0
GNU xargs
는 -r
입력이 없으면 명령 실행을 피해야합니다.
| xargs -r0 cmd
이다 cmd
의 표준 입력이 (영향에 따라되어 xargs
구현, 그건 /dev/null
또는 관.
-exec ... ;
세미콜론을 피하는 것을 기억 하는 형식 을 사용하면 파일 이름 당 한 번 명령을 실행합니다. 을 사용 -print0 | xargs -0
하면 파일 이름 당 여러 명령을 실행합니다. -exec +
하나의 명령 줄에 여러 파일을 넣는 형식을 사용해야 하며 많은 수의 파일이 관련된 경우 훨씬 빠릅니다.
사용의 큰 장점 xargs
사용하여 병렬로 여러 개의 명령을 실행할 수있는 기능입니다 xargs -P
. 멀티 코어 시스템에서는 시간을 크게 절약 할 수 있습니다.
-P
대신에 의미 했습니다 -p
. xargs -P
POSIX 표준이 아니라는 점 을 명심하십시오 find -exec {} +
. 이는 이식성을 위해가는 경우 중요합니다.
find /tmp/ -exec ls "{}" +
작동합니다.
-exec
오랫동안 오랫동안 모든 것을 탈출 해왔다. (나는 masochist이다. 나는 따옴표를 사용하여 탈출 하지 않고 {}
항상 입력하고 \{\}
묻지 않는다) 모든 것이 지금 탈출 해야하는 것처럼 보인다.
find /tmp/ -exec ls {} +
작동하지 않는 예를 본 적이 없다 .
bash
기 때문에 교정기를 그대로 받아 들일 때 완전히 알아 차리지 못했습니다 . 나는 중괄호가 탈출하지 않았다면 내가 사용한 오래된 껍질 중 적어도 하나가 히스에 적합하다고 확신합니다.
성능에 관해서 -exec … +
는 모든 작업을 수행하는 단일 도구이기 때문에 더 좋을 것이라고 생각 했지만 GNU findutil의 문서-exec … +
중 일부는 효율성 이 떨어질 수 있다고 말합니다 .
[으로 찾기
-exec … +
] 는 일부 용도보다 효율성이 떨어질 수 있습니다xargs
. 예를 들어xargs
, 이전 명령이 여전히 실행되는 동안 새 명령 행을 빌드 할 수 있으며 병렬로 실행할 여러 명령을 지정할 수 있습니다. 그러나이find ... -exec ... +
구성은 이식성이 뛰어나다는 장점이 있습니다. GNU findutils는-exec ... +
4.2.12 버전까지 ' '를 지원하지 않았습니다 [2005 년 1 월] ; 그 이유 중 하나는 이미-print0
어떤 경우에도 ' '조치 가 있었기 때문 입니다.
나는 그것이 무엇을 의미하는지 정확히 알지 못해서 derobert가 다음과 같이 채팅에서 물었 습니다.
find
아마도-exec … +
실행중인 파일의 다음 배치를 계속 검색 할 수는 있지만 그렇지 않습니다.
find … | xargs …
찾기는 다른 프로세스이므로 파이프 버퍼가 채워질 때까지 계속 실행됩니다.
(나에 의해 포맷)
거기에 있습니다. 그러나 성능이 실제로 중요한 경우 현실적인 벤치마킹을 수행하거나 그러한 경우에 쉘을 사용할 것인지 스스로에게 물어봐야합니다.
이 사이트에서 나는 사람들이 -exec … +
양식을 더 단순하고 다른 답변에서 언급 한 이유 때문에 (예를 들어 생각하지 않고 이상한 파일 이름을 처리하기 때문에) 가능한 한 항상 사람들에게 조언하는 것이 좋습니다 .
find
. 고마워요!