파일 이름에 공백이 포함된 디렉터리의 모든 파일에 대해 ffmpeg 명령을 실행하는 bash 스크립트를 만들려고 합니다. 다음은 잘 작동하는 단일 파일을 만들기 시작하는 스크립트입니다. tab
모든 공백을 포함하여 파일 이름 매개변수를 채우는 데 사용하는 이스케이프 문자는 다음과 같습니다.
#!/bin/bash
input="./"$1
output="/xfer/transfer/temp/"$1
ffmpeg -i "${input}" -c:v copy -c:a libfdk_aac -b:a 160k "${output}"
다음 단계는 디렉터리의 모든 파일에 대해 ffmpeg 명령을 실행하는 것입니다. 디렉토리가 다음과 같고 명령이 다음과 같다고 가정합니다 ls
.
'Name of First File.mkv'
'Name of Second File.mkv'
이것은 내 테스트 코드입니다.
#!/bin/bash
files=$(ls *)
for input in ${files}
do
echo $input
done
내 문제는 출력이 다음과 같다는 것입니다.
Name
of
First
File.mkv
Name
Of
Second
File.mkv
ls 명령에 a를 추가하면 -b
각 줄 끝에 백슬래시가 추가됩니다. 등등 $input
처럼 보이게 만드는 데 도움이 필요합니다 .Name of First File.mkv
답변1
의견에서 지적했듯이 매개변수 확장을 인용하고ls
출력을 반복하지 마십시오. 따옴표가 없는 파일 이름은 IFS
쉘 변수에 문자가 포함된 경우 분할될 수 있습니다.
다음 코드로 문제를 해결할 수 있습니다.
for file in *; do
ffmpeg -i "${file}" -c:v copy -c:a libfdk_aac -b:a 160k "/xfer/transfer/temp/${file}"
done
루프에서 패턴을 바꿀 때 주의하세요. 슬래시가 있는 경로 이름 목록으로 확장될 수 있으며 문자열과 연결될 수 있습니다 /xfer/transfer/temp
. 이를 방지하려면 다음을 수행할 수 있습니다.
for file in otherdirectory/*; do
ffmpeg -i "${file}" -c:v copy -c:a libfdk_aac -b:a 160k "/xfer/transfer/temp/$(basename "${file}")"
done
디렉토리를 더 깊게 재귀해야 하는 경우 globstar
다음을 사용하여 옵션을 설정하십시오.shopt
내장 명령.