모든 m4a를 mp3로 변환하려고하는데 내 코드는 다음과 같습니다.
find . -name '*.m4a' -print0 | while read -d '' -r file; do
ffmpeg -i "$file" -n -acodec libmp3lame -ab 128k "${file%.m4a}.mp3";
done
하지만 첫 번째 mp3 파일에서만 작동하고 다음 파일에는 오류가 표시됩니다.
Parse error, at least 3 arguments were expected, only 1 given in string '<All files in one line>'
Enter command: <target>|all <time>|-1 <command>[ <argument>]
이러한 파일에는 공백, 앰퍼샌드 및 괄호가 포함되어 있습니다.
답변1
파일을 한 줄씩 읽을 때 루프 내부의 명령이 stdin도 읽으면 입력 파일이 소진될 수 있습니다.
여기에서 계속 읽어보세요:배쉬 FAQ 89
따라서 코드는 다음과 같아야 합니다.
find . -name '*.m4a' -print0 | while read -d '' -r file; do
ffmpeg -i "$file" -n -acodec libmp3lame -ab 128k "${file%.m4a}.mp3" < /dev/null
done
답변2
-exec
왜 매개변수를 직접 사용하면 안되나요 find
? 그럼 명령을 find -iname '*.m4a' -exec ffmpeg -i {} -n -acodec libmp3lame -ab 128k {}.mp3 \;
실행해볼까요 ?rename
답변3
귀하의 질문은 m4a를 mp3로 변환하는 것에 대해 묻습니다.
이것은 제가 오랫동안 사용해 온 bash 스크립트입니다.
avconv
필요에 맞게 명령을 조정하십시오 .
#!/bin/bash
## jc 2016
## convert [m4a mp3 wma] to mp3 128k
## [-vn] disable video recording
##
## avconv with lame mp3 plugin
## [-acodec libmp3lame]
##
## 192 k constant bitrate
## [-ab 192k]
## [-ab 128k]
##
## 44.1kHz sampling rate
## [-ar 44100]
##
## 2 channel audio
## [-ac 2]
##
## force the shell to do a case insensitive comparison
shopt -s nocasematch
working_directory="./mp3_converted"
# check if dir exist
if [ ! -d "$working_directory" ];
then
# dir does not exist
echo "convert directory does not exist $working_directory..."
`mkdir -p "$working_directory"`
echo "convert directory created $working_directory..."
fi
COUNT=0
for i in *; do
case $i in
*.mp3)
avconv -analyzeduration 999999999 -map_metadata 0 -i "$i" -vn -acodec libmp3lame -ac 2 -ab 128k -ar 44100 "$working_directory/`basename "$i" .mp3`.mp3"
echo $i
;;
*.m4a)
##avconv -analyzeduration 999999999 -map_metadata 0 -i "$i" -vn -acodec libmp3lame -ac 2 -ab 128k -ar 44100 "$working_directory/`basename "$i" .m4a`.mp3"
# adjusted for ffmpeg to test.
ffmpeg -i "$i" -n -acodec libmp3lame -ab 128k "$working_directory/`basename "$i" .m4a`.mp3"
echo $i
;;
*.wma)
avconv -analyzeduration 999999999 -map_metadata 0 -i "$i" -vn -acodec libmp3lame -ac 2 -ab 128k -ar 44100 "$working_directory/`basename "$i" .wma`.mp3"
echo $i
;;
*)
echo "other"
;;
esac
done
## back to normal comparison
shopt -u nocasematch
exit 0