가장 좋은 방법은 디렉토리 트리의 각 파일에서 명령을 실행하는 것입니다


답변:


13
find . -exec <command> {} \;

트리의 루트 또는 일반적으로 현재 디렉토리의 경우 :

find <directory> -exec <command> {} \;

4
일부 시스템에서는 find -exec 옵션이 없으므로 find를 사용할 수 있습니다. | xargs <명령>
Hemant

4
실제로, 그리고 당신이 무언가로 필터링 해야하는 경우, -name "*.c"또는 -type d디렉토리 를 예 를 들어 보십시오 ...

전체 옵션 목록은 unixhelp.ed.ac.uk/CGI/man-cgi?find- 매뉴얼 페이지를 참조하십시오 .
Lucas Jones

-exec 및 xargs 접근 방식을 손상시킬 수있는 공백이있는 파일 이름을 주시 할 수도 있습니다. 참조 tinyurl.com/ygvgmw5
숀 턱을

가능하면 find ... | xargs ...관용구를 사용하면 파일을 일괄 처리하며 일반적으로 속도가 빠릅니다 (프로세스가 덜 시작됨).
vonbrand

5

사용 -print0찾을 수있는 옵션과 -0에 옵션 xargs이 공백 파일이나 디렉토리 이름이있는 경우를 :

find {dir} -print0 | xargs -0r {command}

-print0A는 같은 옵션은 파일 이름 밖으로 인쇄를 찾을 NUL단락 지어진 아니라 공백 이상의 목록을 구분하면서, -0에 옵션 xargs에 지시가에 입력을 깨고 NUL오히려 공백보다. NUL유닉스 파일 이름에 허용되지 않는 문자 중 하나 이므로 파일 이름의 일부로 오인 할 방법이 없습니다.

-r옵션은 그래서 거기 xargs가 더 입력이없는 경우 당신에게 오류를 제공하지 않습니다.


3

이식성이 문제라면 쉘 고유의 방법을 사용하지 않을 것입니다 (많은 다른 쉘을 사용하는 사람들이 많지만 일반적으로 find와 xargs는 아무도 근본적인 방법으로 변화를 감히하지 않는 기본 도구입니다) .

find와 xargs의 기본 인수를 사용하면보다 이식성있는 솔루션을 얻을 수 있습니다.


2

인수를 그룹화 할 수 있으면 | xargs는 find -exec보다 명령을 훨씬 적게 실행하므로 성능이 향상 될 것입니다. 각 파일에 대해 매번 명령을 실행하거나 파일의 서브 디렉토리에서 실행하려면 find -exec 또는 -execdir을 사용해야합니다.

일반적으로 쉘 특정 루프를 피하는 것이 좋습니다. find & xargs는 대부분의 시나리오에 충분합니다.


1

사용중인 명령의 버전에 재귀 작업 플래그가 없는지 확인하십시오. :)


0
find [args] -print | xargs {command}

나를 위해 가장 잘 작동합니다.


2
-1 공백이 포함 된 파일 이름에는 작동하지 않습니다. 더 나은 사용 찾기 -print0 | xargs -0.
starblue
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.