찾기 및 for 루프

찾기 및 for 루프

대규모 음악 컬렉션에서 M4A를 OGG로 대규모 변환을 시도하면서 다음과 같은 결과를 얻었습니다.

#!/bin/sh
for i in `find /home/family/Music -name *.m4a -print0`
   #do ffmpeg -i "$i" -acodec libvorbis -aq 6 -vn -ac 2 "$i.ogg";
   do echo $i
done

모든 파일의 이름에는 공백이 있으며 위 출력에는 다음과 같은 파일이 표시됩니다.

/home/family/Music/The
Kooks/Inside
In
_
Inside
Out/06
You
Don't
Love
Me.m4a

각 공간은 새로운 선을 표시합니다. 그러면 -print0문제가 해결될 수 있을까요?

답변1

while다음 명령문과 함께 루프를 사용하십시오 read -d '' -r.

find /home/family/Music -name '*.m4a' -print0 | while read -d '' -r file; do
   echo "$file"
done

답변2

다음과 같이 외부 루프를 "내부" 루프로 이동하여 단어 분리 문제를 피할 수 있습니다.

find /home/family/Music -name '*.m4a' -exec \
sh -c 'for i; do ffmpeg -i "$i" -acodec libvorbis -aq 6 -vn -ac 2 "$i.ogg"; done' sh {} +

또한 셸에 의한 예기치 않은 전역 확장을 방지하려면 -print0더 이상 필요하지 않습니다 .*.m4a

관련 정보