2014-12-11 7 views
2

그들에 폴더와 CD를 찾을 수 :나는 다음과 같은 구조의 짧은 스크립트를 쓰고 싶다

find the right folders 
cd into them 
replace an item 

그래서 내 문제는 내가 find에서 올바른 폴더를 얻을 수 있지만이 작업을 수행하는 방법을 모르겠입니다 모든 행에 대한 행동은 find입니다. 나는이 같은 for 루프와 그것을 시도 :

for item in $(find command) 
    do magic for item 
done 

하지만 문제는이 명령은 상대 경로 이름을 인쇄합니다, 내 길 내에서 공간이 경우이 시점에서 경로를 분할하는 것입니다.

내 문제를 이해하고 나에게 힌트를 줄 수 있기를 바랍니다.

+11

'찾기. -name blah -exec do_stuff_to {} \;' –

+3

'find -exec'와'xargs'를보십시오. – anubhava

답변

2

직접 찾을 수의 간부 인 옵션을 사용하여 명령을 실행할 수 있습니다 : 그것을 할

find . -name some_name -exec your_command {} \; 
+0

절대 경로를 사용하기를 원했기 때문에'pwd'가있었습니다. 당신이 사용한다면. 상대 경로를 반환합니다. 그래서'pwd'가 실제로 유용하다고 생각합니다. 너 무슨 소리 야? –

+0

PATH에 경로가 있으면'pwd'가 작동하지 않습니다. "정말로"사용해야 할 경우 "pwd"로 인용해야합니다. " – drizzt

1

한 가지 방법은 다음과 같습니다

find command -print0 | 
while IFS= read -r -d '' item ; do 
    ... "$item" ... 
done 

-print0read ... -d '' 원인이 널 (null) 문자 별도의 경로로 사용되는 공백과 개행 문자가 포함 된 경로를 포함하여 모든 경로에서 코드가 작동하는지 확인하십시오. IFS을 비워두고 에 -r 옵션을 사용하면 경로가 read으로 수정되지 않습니다.

루프는 while 루프가 서브 쉘에서 실행되므로 루프가 완료된 후에도 그 안에 설정된 변수가 표시되지 않습니다. 배시 4.2 가지고 이상이있는 경우

while IFS= ... 
    ... 
done < <(find command -print0) 

또 다른 옵션은, 할 수있는 lastpipe 옵션 (shopt -s lastpipe)를 사용하는 것입니다 : 그 문제가 될 경우, 하나의 방법은 대신 파이프의 공정 대체를 사용하는 것입니다 해결하기 위해 현재 셸에서 파이프 라인의 마지막 명령이 실행되도록합니다.

+0

이 솔루션은 제 경우에는 완벽하게 작동합니다. 여러분 모두에게 감사드립니다. – hGen

0

찾는 패턴이 충분히 간단하고 bash 4가있는 경우 find이 필요하지 않을 수 있습니다. 이 경우, 대신 재귀 대체 (globbing)에 대한 globstar을 사용할 수

#!/bin/bash 

shopt -s globstar 
for directory in **/*pattern*/; do 
    (
    cd "$directory" 
    do stuff 
    ) 
done 

괄호는 각 작업은 서브 쉘에서 발생합니다. 성능 비용이 들지만 대개는 그렇지 않으므로 매번 cd 번을 기억할 필요가 없습니다. globstar 만약

를 선택할 수 없습니다 당신은 비슷한 방법으로 find을 사용할 수 있습니다 (귀하의 find 지침 간단한 패턴하지 않기 때문에, 또는 당신이 그것을 지원하는 쉘이 없기 때문에) :

find . -whatever -exec bash -c 'cd "$1" && do stuff' _ {} \; 

; 대신 +을 사용하면 매번 bash에 여러 인수를 전달할 수 있지만 쉘 당 하나의 디렉토리 (;의 경우)를 수행하면 위의 서브 쉘 표현식을 사용하는 것과 유사한 이점과 비용이 발생합니다.

관련 문제