상태:
- 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
내가 어떻게 할 수있는:
- 스크립트를 사용하여 하나의 명령으로 이러한 모든 파일을 컨테이너에
.avi
리믹스 하시겠습니까.mp4
? 원하는 출력 파일 이름을 지정하는 동안 출력을find
입력으로 파이프하는 방법을 잘 모르겠습니다 .ffmpeg
- 원본
.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
shellproc
in은...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 {} \;