입력 및 출력 이름 목록을 한 줄씩 가져와 변환을 위해 ffmpeg에 공급하는 빠른 쉘 스크립트가 있습니다. 일부 출력 경로에는 공백이 포함되어 있으며 공백이 포함된 경로를 어떻게 이스케이프하거나 큰따옴표로 묶어도 두 가지 오류 중 하나가 발생합니다.
입력 파일
file1.avi "output path"/file1.mp4
file1.avi "output\ path"/file1.mp4
file1.avi "output path/file1.mp4"
file1.avi output\ path/file1.mp4
변환.sh
while read -r file1 file2; do ffmpeg -i "$file1" -c copy -bsf:a aac_adtstoasc $file2; done <list
내가 겪는 오류 중 하나는 다음과 같습니다.
'출력 경로'/file1.mp4: 해당 파일이나 디렉터리가 없습니다.
내가 겪는 또 다른 오류는 다음과 같습니다.
'출력'에 적합한 출력 형식을 찾을 수 없습니다.
입력 파일 행의 변경 사항은 공백을 탈출하려고 시도한 내용을 보여주기 위한 것입니다. 나는 또한 주위에 큰 따옴표를 추가하려고 시도했습니다.파일 2쉘 스크립트에서.
답변1
파일 이름에 리터럴 백슬래시 문자가 포함되어 있지 않다고 가정하면 파일에서 백슬래시 이스케이프를 사용하는 경우(따옴표 제외 list
)
file1.avi output\ path/file1.mp4
그럼 넌 할 수 있어소홀히 하다-r
~하도록 하다read
하다리터럴 문자 시퀀스 대신 이스케이프 시퀀스(공백으로 해석됨)를 해석합니다 \
. 그런 다음 일반적인 방법으로 확장을 큰따옴표로 묶을 수 있습니다.
while read file1 file2; do
ffmpeg -i "$file1" -c copy -bsf:a aac_adtstoasc "$file2"
done <list
표시하려면:
$ cat list
file1.avi output\ path/file1.mp4
그 다음에
$ while read file1 file2; do
printf '==%s==\n==%s==\n' "$file1" "$file2"
done <list
==file1.avi==
==output path/file1.mp4==