2012-04-25 4 views
2

나는 종종 find을 사용하여 여러 개의 파일에서 동일한 스크립트를 실행합니다. 내가 dir의 모든 .png 파일에 process.py을 실행하려는 경우 예를 들어, 그래서, 내가 할 것이다 :많은 도피없이 find -exec을 사용하는 방법

find dir -name '*.png' -execdir process.py \{\} \; 

결국 울타리의 일이 짜증나는, 주위 어떤 방법을?

답변

5

키보드 레이아웃에 따라 ' 또는 \보다 "이 더 편리 할 수 ​​있습니다. {}은 스택 교환 사이트 Unix & Linux에서 알 수 있듯이 이스케이프가 필요하지 않습니다. 누구도 {}을 필요로하는 쉘을 식별 할 수 없으며, 매뉴얼 페이지의 예제는 중괄호를 벗어나지 않습니다.

find dir -name "*.png" -execdir process.py {} ";" 

요나단 Leffler는 의미가 동일하지 않지만 종종 사용할 수있는 +가있는 솔루션을 가지고 있습니다.

+0

포인트를 설명합니다. 나는 [조나단의 대답] (http://stackoverflow.com/a/10320437/915501)을 좋아하지만, 효과를 바꾸고 싶지 않았다. 단지 모든 \를 타이핑하지 않기 위해서였다. 최소한 이것은 두 가지가 적습니다. – Shep

+0

잘 모르겠다.'man 페이지에 쓰여져 있지만, 마스킹이 필요한 쉘을 말할 수있다. '[man page examples] (http://ss64.com/bash/find.html #examples) 실제로' '{}' '를 보여 주지만, 이것은 분명히 bash (필자가 검사)에 의해 요구되지는 않는다. – Shep

+0

@Shep : [{}에 관한 U & L discussion이 있습니다. (http://unix.stackexchange.com/questions/8647/gnu-find-and-masking-the-for-some-shells-which) . –

5

사용 :

find dir -name '*.png' -execdir process.py {} + 

{} 탈출이 필요하지 않습니다; 그들은 단지 제한된 환경에서만 쉘에 특별한 의미를 갖는다. 특히 echo {}은 중괄호를 반향하는 반면, echo {a,b,c}a b c을 반향합니다. +도 이스케이프 할 필요가 없습니다. find에 'play at being xargs'이라고 알려줍니다. 즉, 각 실행에 대해 합리적으로 가능한 많은 파일 이름으로 명령을 실행합니다. 자동 종합적으로 -exec 또는 -execdir을 사용하여 파일 이름에 공백 (— 줄 바꿈, 백 스페이스, 폼 피드, 누구? 및 기타 어색한 문자)의 문제를 다루는 것을

참고. -print으로 파이프 이름을 xargs에 넣으면 여기서 문제가 발생합니다. GNU find 더하기 GNU xargsfind-print0 옵션을 제공하고 -0 옵션을 xargs으로 제공하여 파일 이름에 이상한 문자 문제를 해결합니다.

파일 당 스크립트를 한 번 실행해야하는 경우 끝에는 이스케이프 처리 된 세미콜론이 필요합니다. 그 주위에는 쉬운 방법이 없습니다 (카운트하지 않는 한 : SC=";"; find ... {} $SC, 그렇지 않습니다).

유일한 문제는 하위 디렉토리에서 스크립트를 실행하는 -execdir입니다. 다른 디렉토리에 다른 파일이있을 때 제대로 동작하는지 확인해야하며, -execdir (와 같이 사용하면 {}이 '발견 된 디렉토리에 상대적인 파일 이름'으로 변환되어야합니다. 그렇지 않으면 일반적으로 스크립트에 지정된 이름을 통해 파일을 찾을 수 없습니다. 그렇지 않은 경우 옵션이 의미있게 사용할 수 없으므로이 모든 것이 '효과가 있습니다'.

개인적으로는 평범한 -exec을 사용하고 싶지만 -execdir을 선택한 이유가 아마도 있습니다.

+0

Find는 -exec 또는 -execdir을 사용했는지 여부에 상관없이 찾은 파일이 스크립트에 올바르게 전달되도록하기 때문에 걱정할 필요가 없습니다.파일이있는 디렉토리에서 프로그램을 수행하는 것이 유용 할 때도 있습니다 (이름 변경, 구성 정보 읽기 ...). –

+0

사용하려면 거의해야합니다. 나는'-execdir'을 사용하지 않았다. (내가했던 것을보기 위해 매뉴얼 페이지를 점검해야했다.) 가끔 도움이 될 수도 있지만 스크립트 스타일은 필자가 생각할 수있는 모든 상황에서'-exec'와'-execdir'의 영향을받지 않을 것입니다. –

+0

인위적인 예제에 대해 유감스럽게 생각하지만, @userunknown은 문제를 해결합니다 :'process.py'가 상주하는 디렉토리는 발견 한 파일 이상으로 상대 경로가 중요합니다. – Shep

0

작은 따옴표 '{}' ''; 대신 쉘 자체가 이러한 문자를 해석하지 못하게해야합니다. 발견 된 수가 적 으면 xargs도 작동합니다.

+0

"xargs"는 발견 된 파일 수가 많으면 작을 것입니다. 왜냐하면'xargs'의 전체적인 점은 발견 된 파일의 수가 엄청날 때 작동한다는 것입니다. 파일을 관리 가능한 그룹으로 분할하고 각 그룹에 대해 명령을 실행합니다. –

관련 문제