내 디렉토리에 연결하고 싶은 비디오 목록이 있습니다.
Video1.mpg
Video2.mpg
.
.
.
Video35.mpg
cat 명령에 수동으로 쓸 필요 없이 번호가 매겨진 순서대로 연결하고 싶습니다.
답변1
그리고 zsh
그리고ffmpeg
:
files=(Video*.mpg(n))
ffmpeg -f concat -safe 0 -i <(printf 'file %s\n' ${(qq)files}) -c copy output.mpg
(n)
는zsh
글로벌 예선숫자순으로 정렬합니다. (qq)
작은따옴표로 묶인 변수 확장 플래그입니다. ffmpeg
파일 이름에 작은따옴표, 백슬래시 또는 개행 문자가 포함되어 있으면 예상대로 정확하게 인용된다고 보장할 수 없습니다.
내가 이해한 바로는 위의 내용은 모든 mpg 파일이 동일한 코덱을 사용한다고 가정합니다.
AFAICT, mpeg
특히 파일의 경우 파일을 파일 수준에서 연결할 수도 있으며 대부분의 플레이어에서 계속 재생할 수 있으므로 다음을 수행할 수도 있습니다(여전히 작동함 zsh
).
cat Video*.mpg(n) > output.mpg
macOS에 기본적으로 설치되어 있지만 zsh
기본 로그인 셸을 명시적으로 변경하지 않는 한 터미널에서 얻을 수 있는 기본 셸은 아닙니다 bash
. 따라서 먼저 터미널의 쉘 프롬프트에 입력 zsh
하거나 다음을 실행해야 합니다.zsh
bash
zsh -c 'cat Video*.mpg(n) > output.mpg'
대신에.
답변2
Bash 중괄호 확장을 사용하십시오.
cat Video{{1..9},{10..35}}.mpg > outputfile
앞으로는 0
파일 이름을 처음 지정할 때 패딩이 사용되므로 다음과 같이 할 수 있습니다.
cat Video{01..35}.mpg > outputfile
답변3
한 가지 방법은 다음과 같습니다.
cat $(ls Video*.mpg | sort -to -k2 -n )>outputfile
ls Video*.mpg
- 패턴을 기준으로 파일 나열 - 구분 기호, 두 번째 키 및 숫자를 사용하여
sort -to -k2 -n
파일 정렬o
-n
* ls
알 수 없는 파일 목록에서 작업하는 것은 예측할 수 없지만 질문에 따르면 이것은 상대적으로 작고 알려진 목록입니다.