2012-06-15 2 views
1

나는 모든 파일을 통해 몇 가지 명령을 실행 한 번이 모든 디렉토리로 이동하는 명령이 있습니다`for` 루프가 공백을 파싱하는 것을 막는 방법?

STDIR=$PWD; 
for dir in $(find . -type d 2>&-); do 
    cd "$dir"; 
    for file in $(find * -prune -type f 2>&-); do 
     command "$file"; 
    done; 
    cd "$STDIR"; 
done 

을하지만, 파일이나 디렉토리 이름에 공백이 문제가있다. 어떻게 해결할 수 있습니까?

이 질문은 this question에 답을 적용하려고 할 때 나타납니다.

편집 : 좋은 해결책은 this comment에도 있습니다. 공간 문제를 해결하기 위해, done

IFS=$'\n' 
상기 코드의 첫 번째 행 후

unset IFS 

추가.

+3

일반적으로 단어 분리를 위해'for $ i (command)'를 사용하면 안됩니다. – jordanm

+0

가능한 [BASH에 공백이있는 파일 이름] (http://stackoverflow.com/questions/3967707/file-names-with-spaces-in-bash) – finnw

+0

예 : http://stackoverflow.com/a/10984996/1276280 – pizza

답변

3

입니다 lution은 이점이 있습니다 : 당신은 변종 (1)과 (2)에서와 같이 많은 포크를 필요로하지 않습니다. 그리고 많은 라인을 처리해야 할 때 중요해질 수 있습니다.

+0

'-execdir'은 파일이 들어있는 디렉토리에서 명령을 실행하기 때문에이 예제와 같지 않습니다. 수동으로 추가하려면'cd '가 필요합니다. – Sorpigal

2

find-exec을 사용하고 for을 사용하지 않는 것이 좋습니다.

또는 -print0find하고, --null

4

짧은 대답은 항상있다과 xargs 같은 "새로운 라인"등의 NULL 문자를 해석하는 프로그램 "확장 견적,"하지만 귀하의 경우 정확한 대답을 사용

1) find -exec (see the answer from Sorpigal) 
2) find ... | xargs 
3) find ... | while read line ; do command "$line" ; done 

세 번째를 이렇게 세 가지 방법이 있습니다

find . -type f -execdir command {} \; 
관련 문제