Bash에서 이름에 파이프와 공백이 포함된 파일을 반복하는 방법

Bash에서 이름에 파이프와 공백이 포함된 파일을 반복하는 방법

이 고전적인 솔루션(이름에 공백만 있는 경우)은 작동하지 않습니다.

find . -name '*.html' -print0 | while IFS= read -r -d ''; do

html 파일에도 세로줄( |)이 포함되어 있기 때문입니다.

답변1

find . -name '*.html' -print0 | while IFS= read -r -d ''; do

이 줄의 어떤 내용도 이름에 공백 및/또는 파이프 조합이 포함된 파일 이름에 문제를 일으키지 않습니다.

bash-4.4$ touch 'A|B' '1|2' 'quux|foo bar'
bash-4.4$ ls
1|2          A|B          quux|foo bar
bash-4.4$ find . -print0 | while IFS= read -r -d ''; do printf '"%s"\n' "$REPLY"; done
"."
"./A|B"
"./1|2"
"./quux|foo bar"

또한 찾은 이름으로 무엇을 하려는지에 따라 거의 항상 자체적 -exec으로 사용하는 find것이 더 좋습니다 .

find . -type f -name "A*" -exec cat {} \;

다른 질문에 대한 관련 답변:공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?(특히 이 답변에서 "find로 찾은 파일로 무엇을 해야 할까요?"를 참조하세요.)

답변2

find매우 오래된 버전 bash(4.0 이전)의 경우 이와 같은 간단한 호출만 필요합니다. 연산자를 사용하는 것이 훨씬 간단합니다 globstar.

shopt -s globstar
for f in **/*.html; do
    ...
done

관련 정보