ffmpeg는 하위 디렉터리의 .avi 파일에 걸쳐 있습니다.

ffmpeg는 하위 디렉터리의 .avi 파일에 걸쳐 있습니다.

상태:

  • macOS 10.13.6 실행 및 bash 5.0.17(1) 사용
  • 여러 파일을 포함하는 많은 하위 디렉터리.
  • 하위 디렉터리에서 특정 확장자(.avi)를 가진 파일을 필터링해야 합니다.
  • 모든 .avi 파일은 .mp4를 사용하여 처리하고 리믹스해야 합니다 ffmpeg. ffmpeg리믹스하려면 다음 구문을 사용하세요.ffmpeg -i in.avi -c copy out.mp4
  • 출력 형식: 소스 .avi 파일과 동일한 폴더에 위치하며 동일한 파일 이름을 사용합니다(.avi 확장자 제외).

파일 구조 예:

$ find . -maxdepth 2
.
./abc
./abc/abc.avi
./xyz
./xyz/xyz.avi.mp4
./123
./123/123.avi

이 경우 파일 합계를 필터링 ./abc/abc.avi하고 ./123/123.avi정규식 합계를 사용하여 이 작업을 수행할 수 있습니다 find.

$ find -E . -iregex ".*\.avi"
./abc/abc.avi
./123/123.avi

원하는 리믹스 .mp4출력 파일 이름은 다음과 같습니다:

./abc/abc.mp4
./123/123.mp4

내가 어떻게 할 수있는:

  1. 스크립트를 사용하여 하나의 명령으로 이러한 모든 파일을 컨테이너에 .avi리믹스 하시겠습니까 .mp4? 원하는 출력 파일 이름을 지정하는 동안 출력을 find입력으로 파이프하는 방법을 잘 모르겠습니다 .ffmpeg
  2. 원본 .avi파일을 삭제하지만 재다중화에 성공한 경우에만 해당됩니까?

답변1

저는 Arch Linux 사용자가 아니며 이 답변을 Arch Linux 환경에서 작성하고 ffmpeg있지만 FreeBSD 및 MacOS-X에서는 두 가지 요구 사항을 충족할 수 있습니다. 예를 들면 다음과 같습니다.bash

$ from=avi; to=mp4; 
$ find -E . -type f -iregex ".*\.avi" -execdir \
  sh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3' shellproc "$from" "$to" {} \;

위 줄에서 :

  • -type f이전에 포함시켰습니다 . "일반 파일" 유형의 파일만 수행하면 시간이 절약 -iregex ...됩니다 .stat
  • $1대표하다$from
  • $2대표하다$to
  • $3명령 {}의 결과를 나타냅니다.find
  • shellprocin은 ...shellproc "$from" "$to" {} \;다음 명령을 사용하여 실행되는 쉘 프로세스를 식별하는 데 사용되는 임의의 표시일 뿐입니다 sh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3'. 이 레이블은 셸에서 출력되는 모든 오류 메시지 앞에 붙습니다. 이것이 하는 일입니다.

원하는 것을 달성하는 방법에는 여러 가지가 있습니다. 꼭 살펴보시길 권합니다답변저자: Kusalananda, 구문에 대해 더 자세히 알아보세요 find ... -exec....

답변2

~에 귀속됨Cbhihe의 답변, 그것이 나를 올바른 길로 인도했기 때문입니다. Mac에서 기준선이 작동하는 방식과 파일 이름의 공백 처리로 인해 몇 가지 사항을 변경해야 했습니다.

macOS는 find다소 특별한 구문을 사용합니다. 다음 한 줄을 사용할 수 있습니다.

find -E . -type f -iregex ".*\.avi" -execdir bash -c 'in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"' shellproc {} \;

  • find -E . -type f -iregex ".*\.avi"파일 검색:
    • .현재 디렉토리를 검색하고 있음을 나타냅니다.
    • -E정규식을 사용한 확장 검색이 허용됨을 나타냅니다.
    • -iregex ".*\.avi"하위 디렉터리를 포함하여 이 경로에 있는 모든 ".aviz" 파일을 검색합니다.
  • -execdir bash -c '<COMMAND>' shellproc {} \;bash 셸을 사용하여 각 검색 결과에 대해 명령을 실행하고 검색 결과와 동일한 디렉터리에서 실행합니다. 파일 이름은 $1 매개변수로 전달됩니다.
  • in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"입력 및 출력 파일 이름을 정의하고, 리믹스를 위해 ffmpeg를 실행하고, 자세한 ffmpeg 출력을 억제하고, 리믹스가 성공적으로 완료된 경우에만 입력 파일을 삭제합니다.

Linux 시스템에서는 find구문이 약간 다릅니다.

find . -type f -regex ".*\.avi" -execdir bash -c 'in=$1; out=${in%.*}.mp4; (ffmpeg -y -i "$in" -c copy "$out") 2>/dev/null && \rm "$in"' shellproc {} \;

관련 정보