이 고전적인 솔루션(이름에 공백만 있는 경우)은 작동하지 않습니다.
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