ls 및 이스케이프 문자에 대한 도움이 필요합니다.

ls 및 이스케이프 문자에 대한 도움이 필요합니다.

파일 이름에 공백이 포함된 디렉터리의 모든 파일에 대해 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내장 명령.

관련 정보