모든 하위 폴더에서 다음 명령을 실행하고 싶습니다.
for f in *.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" && mv "tmp_${f}" "${f}"
done
폴더 구조: 기본 폴더 2019의 모든 하위 폴더에서 명령을 실행하고 싶습니다. 매월 폴더(1월 "/home/okr/test/2019/01/")가 있습니다.
답변1
다음 명령은 현재 디렉터리의 모든 하위 폴더에서 .mp4
확장자( )를 가진 파일을 반복적으로 검색하고 -name "*.mp4"
옵션을 사용하여 각 파일에 대해 명령을 실행합니다.ffmpeg
-exec
for f in *.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" &&
mv "tmp_${f}" "${f}"
done
답변2
재귀적으로:
shopt -s globstar
for f in **/*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${f}.tmp" && mv "${f}.tmp" "${f}"
done
답변3
나생각하다원하는 것은 cd
각 하위 폴더로 이동하여 명령을 실행하는 것입니다. 다음과 같이 할 수 있습니다.
for dir in */; do
(
cd "$dir"
for f in ./*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "tmp_${f}" && mv "tmp_${f}" "${f}"
done
)
done
(괄호는 하위 쉘을 열어 cd
상위 쉘에서의 위치에 영향을 주지 않고 하위 쉘에 들어갈 수 있도록 합니다.) /
또는 단순히 모든 mp4 파일을 재귀적으로 찾아 해당 파일에 대해 명령을 실행하려면 다음을 수행할 수 있습니다.
shopt -s globstar
for f in **/*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${f}.tmp" && mv "${f}.tmp" "${f}"
done
globstar 옵션은 **
( man bash
)에서 다음을 제공합니다.
**
설정된 경우 경로 이름 확장 컨텍스트에 사용된 패턴은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 패턴 뒤에 가 오면/
디렉터리와 하위 디렉터리만 일치합니다.
답변4
for f in **/*.mp4; do
ffmpeg -i "${f}" -c:v libx264 -b:v 1.5M -c:a aac "${f}.tmp.mp4" && mv "${f}.tmp.mp4" "${f}";
done
당신의 지원에 감사드립니다!