파일 변환을 자동화하는 방법을 찾고 있습니다. 저는 Windows 설치에 액세스할 수 있는 Ubuntu 가상 머신을 사용하고 있습니다. 일반적인 구문은 다음과 같아야 합니다.
ffmpeg -i file.mp4 file.mp3
그래서 제가 하고 싶은 일은 다음과 같습니다.
ls | while read i; do echo ffmpeg -i \"$i\" \"${i/mp4/mp3}\"; done
보시다시피 생성된 명령을 먼저 확인하기 위해 "echo"를 추가했는데 결과는 다음과 같습니다.
ffmpeg -i "Accepting Amendments.mp4" "Accepting Amendments.mp3"
보시다시피 파일 이름에 공백이 있을 수 있으므로 이스케이프를 시도했습니다. 그러나 "echo"를 제거하면 이 명령이 작동하지 않습니다. 어떤 변환이 발생하고 다음과 같은 분할 파일 이름이 포함된 오류 메시지가 표시됩니다."수정안을 수락합니다.mp4"예를 들어. 따라서 기본적으로 첫 번째 ffmpeg 명령은 정상적으로 실행되고 두 번째 명령은 실패하는 식입니다.
명령을 실행했을 때 ls
작은 따옴표가 있는 파일 이름을 얻었지만 파일을 직접 생성했을 때 따옴표가 없다는 것을 알았습니다.
$ls
'Accepting Amendments.mp4'
$touch test
$ls
'Accepting Amendments.mp4'
test
이것이 문제가 될 수 있습니까?
답변1
아니요, 문제는 (을 사용하여 ) 변환하려는 파일에 이름에 따옴표가 포함되어 있음을 \"
알리는 것입니다 . 파일이 존재하지 않아 실패합니다. 실제로 원하는 것은 쉘이 "포함된 값을 분할하지 않음"으로 해석하는 이스케이프되지 않은 따옴표를 사용하는 것입니다.ffmpeg
"Accepting Amendments.mp4"
ffmpeg
ffmpeg -i "$i" "${i/mp4/mp3}"
와는 별개로,ls의 출력을 파이핑하는 대신자신만의 쉘 루프를 가질 수 있거나 있어야 합니다:
for i in *.mp4; do ffmpeg -i "$i" "${i/mp4/mp3}"; done
하지만 ffmpeg
여전히 작동하지 않습니다. 왜냐하면어떤 이유로 표준 입력에서 읽기이런 식으로 파일 이름에서 일부 문자를 먹는 것 같습니다. 이 -nostdin
플래그는 다음을 수행하는 데 도움이 됩니다.
for i in *.mp4; do ffmpeg -nostdin -i "$i" "${i/mp4/mp3}"; done
(출력에 표시되는 작은따옴표는 ls
space 등이 포함된 파일 이름 버전에 따라 추가되므로 ls
명령줄의 출력을 다른 프로그램의 인수로 간단히 전달할 수 있습니다. 이는 작성자와는 아무런 관련이 없습니다. 파일의 경우 이름이 지정된 파일의 동작을 트리거하지 않습니다 test
.