현재 최선의 선택은 다음과 같습니다.
for i in $(find . -name *.jpg); do echo $i; done
문제: 파일 이름에서 공백을 처리하지 않습니다.
참고: 나는 또한 "tree" 명령과 같은 그래픽 방식을 선호합니다.
답변1
정식 방법은 다음과 같습니다
find . -name '*.jpg' -exec echo {} \;
\;
( 한 번에 +
여러 파일을 전달 하여 대체 )echo
또는 (GNU에만 해당되지만 현재 일부 BSD에도 해당 기능이 있음):
find . -name '*.jpg' -print0 | xargs -r0 echo
지쉬어:
for i (**/*.jpg(D)) echo $i
답변2
더 나은 답변이 제공되었습니다.
그러나 귀하가 제공한 코드에서 공백이 유일한 문제는 아니라는 점에 유의하십시오. 탭, 줄바꿈, 와일드카드도 문제입니다.
그리고
IFS='
'
set -f
for i in $(find . -name '*.jpg'); do echo "$i"; done
그렇다면 개행 만 문제입니다.
답변3
당신이 언급한 것은 사람들이 파일 이름을 읽으려고 할 때 직면하는 기본적인 문제 중 하나입니다. 때로는 파일 및 폴더 구조에 대한 지식이 부족하고 오해가 있는 사람들이 "UNIX에서는 모든 것이 파일입니다." . 따라서 파일 이름은 공백이 포함된 2개 이상의 단어로 구성될 수 있으므로 공백도 처리해야 한다는 점을 이해하지 못합니다.
해결책:따라서 잘 알려진 방법 중 하나는 다음을 수행하는 것입니다.깨끗한 독서.
여기에서는 존재하는 모든 파일을 읽고 이를 변수에 저장하고 다음에 필요한 처리를 수행할 때 해당 변수를 따옴표로 묶어 유지하면 파일 이름이 공백으로 보존됩니다. 이것은 이를 수행하는 기본 방법 중 하나이지만 여기의 다른 답변도 잘 작동합니다.
스크립트:
find /path/to/files/ -iname "*jpg" | \
while read I; do
cp -v --parent "$I" /backup/dir/
done
여기에서는 파일에 대한 경로를 제공하여 파일을 읽고 있으며, 내가 읽고 있는 내용은 변수 I에 저장합니다. 이 변수는 나중에 처리할 때 참조하여 올바르게 처리되도록 공백을 보존합니다.
이것이 어떤 식으로든 도움이 되기를 바랍니다.
답변4
최신 버전의 bash에서는 다음 globstar
옵션을 사용할 수 있습니다:
shopt -s globstar
for file in **/*.jpg ; do
echo "$file"
done
간단한 작업의 경우 루프를 완전히 건너뛸 수도 있습니다.
echo **/*.jpg