동일한 폴더에 있는 동일한 이름을 가진 여러 파일(.aif 및 .mp4)을 [original_name]_new.mp4라는 새 폴더에 병합하는 스크립트가 필요합니다.
암호:
#!/usr/bin/env bash -e
function combine(){
ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
}
for video in ‘“*.mp4’; do
name="{video%.*}
audio=${name}.aif
output=${name}_new.mp4
combine $audio $video $output
done
내가 얻는 결과는 다음과 같습니다.
Last login: Sun Oct 18 20:31:10 on ttys000
Tjalles-Mac-Pro:~ tjallo$ /Users/tjallo/Desktop/Christof/try1\ copy.command ; exit;
/Users/tjallo/Desktop/Christof/try1 copy.command: line 8: unexpected EOF while looking for matching `"'
logout
[처리완료]
(2015년 10월 18일 재수정)
@derobert 편집: 이제 내 코드는 다음과 같습니다.
set -x
#!/usr/bin/env bash
set -e
function combine(){
ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
}
for video in *.mp4; do
name=“${video%.*}”
audio=“${name}.aif”
output=“${name}_new.mp4”
combine "$audio" "$video" "$output"
done
출력은 다음과 같습니다.
Last login: Sun Oct 18 21:13:27 on ttys001
Tjalles-Mac-Pro:~ tjallo$ /Users/tjallo/Desktop/Christof/try1\ copy.command ; exit;
++ set -e
++ for video in '*.mp4'
++ name='“*”'
++ audio='““*”.aif”'
++ output='““*”_new.mp4”'
++ combine '““*”.aif”' '*.mp4' '““*”_new.mp4”'
++ ffmpeg -i '““*”.aif”' -i '*.mp4' -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest '““*”_new.mp4”'
ffmpeg version 2.8 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
““*”.aif”: No such file or directory
logout
[Process completed]
답변1
스크립트에 몇 가지 문제가 있습니다.
의견에서 지적했듯이 :
#!/usr/bin/env bash -e
-e
옵션이 실제로 bash에 전달되지 않을 수도 있습니다 . 대신 set -e
원할 경우 줄 아래에 배치하세요 .
다음:
for video in ‘“*.mp4’; do
우선, 직선 따옴표 '와 "가 아닌 둥근 따옴표 ', ', "입니다. 사용하는 글꼴에 따라 구별하기 어려울 수 있습니다. 껍데기언제나직선 따옴표를 사용하십시오. 둘째, *.mp4
절대 인용해서는 안 됩니다. 따옴표는 확장을 방지하며 디렉터리의 모든 파일 *.mp4
로 확장 하려고 합니다 ..mp4
다음 줄에도 오류가 있는데, 이는 쉘이 불평하는 것입니다:
name="{video%.*}
거기에 가까운 인용문을 놓쳤습니다.
오류 메시지를 읽는 방법을 알게 되면 쉘이 이를 알려줄 것입니다. 먼저 줄 번호를 매겨야 합니다. 줄 번호를 표시하거나 번호별로 줄로 이동할 수 있는 옵션을 편집기에서 찾는 것이 좋습니다. 편의상 아래에 넣어 두었습니다.
1 #!/usr/bin/env bash -e
2
3 function combine(){
4 ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
5 }
6
7 for video in ‘“*.mp4’; do
8 name="{video%.*}
9 audio=${name}.aif
10 output=${name}_new.mp4
11 combine $audio $video $output
12 done
이 메시지를 이해하는 열쇠는 "EOF"가 "파일 끝"을 의미한다는 것을 아는 것입니다. 따라서 기본적으로 쉘은 "
8행에서 a를 찾았습니다. (인용문을 끝내기 위해) 일치 항목을 계속 찾고 있지만 "
일치 항목을 찾는 대신 파일 끝을 찾습니다.
아직도 질문이 있습니다:
combine $audio $video $output
여기서는 이러한 파일 이름을 전달하고 싶습니다.아니요추가 확장이나 단어 분리(그렇지 않으면 공백이 포함된 파일 이름이 실패합니다). 따라서 다음을 인용해야 합니다: combine "$audio" "$video" "$output"
.
마지막으로 디버깅해야 할 마지막 문제가 하나 있습니다. set -x
맨 위에 하나를 추가하는 것입니다. 이렇게 하면 실행 중인 명령이 먼저 에코되어 무슨 일이 일어나고 있는지 확인할 수 있습니다.
첨부된:당신의 모습을 보면원래 질문 코드, 그런 문제는 많지 않습니다. 그러므로 모든 혼란.
어디서나 곱슬 따옴표
편집자에게 큰 따옴표 삽입을 중단하라고 알려야 합니다.