하위 폴더에서 특정 확장자를 가진 모든 파일에 대해 우아한 방식으로 작업을 수행하는 방법은 무엇입니까?

하위 폴더에서 특정 확장자를 가진 모든 파일에 대해 우아한 방식으로 작업을 수행하는 방법은 무엇입니까?

현재 최선의 선택은 다음과 같습니다.

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

관련 정보