모든 하위 폴더에서 명령 실행

모든 하위 폴더에서 명령 실행

모든 하위 폴더에서 다음 명령을 실행하고 싶습니다.

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

당신의 지원에 감사드립니다!

관련 정보