2016-10-04 8 views
2

몇 백 개의 비디오를 X265로 다시 인코딩하려고하지만 일부 파일의 경우처럼 파일 이름에 공백이있는 많은 디렉토리가 있습니다. 나는 많은 스크립트를보고 공간과 다른 디렉토리 레벨에서 작동하는 스크립트를 찾기 위해 고심하고있다. 나는이 bash는 스크립트 작업을 시도하고있다ffmpeg 하위 폴더가있는 일괄 reencode

#!/bin/bash 
for i in *.avi; 
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i" 
done 

하지만 내가 추측하고있는 공백와 함께 실패

이 사람은 한 어떤 서브 디렉토리가 없기 때문에, 작동합니다.

#!/bin/bash 
inputdir=$PWD 
outputdir=$PWD 
while IFS= read -r file ; do 
    video=`basename "$file"` 
    dir=`dirname "$file"` 
ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video" 
done < <(find "$inputdir" -name "*.avi" | head -100) 

이 스레드에서는 Windows 사용자에게는 좋지만 Linux에는 적합하지 않은 것으로 보입니다. 당신이 떠들썩한 파티에 적합한 최적의 솔루션으로 날 지점 수 있다면 FFMPEG - Batch convert subfolders

FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"

, 나는 그것을 감사하겠습니다.

답변

2

-print0-0가 공백 이름의 적절한 처리를 보장하기위한 통상적 인 find 시나리오 xargs

find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh 

이다.

그리고 convert.sh에서

, 당신은 당신의 루프를 들어, 첫 번째 스크립트에서와 거의 같은

아무것도없이
#!/bin/bash 

for i; do 
    d=$(dirname "$i") 
    b=$(basename "$i") 
    ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b" 
done 

for i이 같은 의미가 전달 된 파일은 "주어진 모든 인수" xargs.

문자열 앞에 파일 이름을 추가하려면 이름을 기본 디렉터리와 기본 파트로 분할 한 다음 다시 함께 묶어야합니다.

+0

감사합니다 올라프,이 우아한 솔루션처럼 보이지만 첫 번째 디렉토리로 갈 때 디렉토리 이름 앞에 X265_를 추가하려고하면 오류가 발생합니다. 이 오류가 발생합니다 :'X265_./Sub Directory/Spaces with File.avi : No such file or directory' – Alan

+0

@Alan 이것은 제대로 작동하지 않을 수 있습니다. 어쩌면 따옴표를 사용하여 도망 가면서 도망 가야 할 수도 있지만, 이제는 내 컴퓨터에서 테스트하지 않아도됩니다. –

+0

Thanks @Olaf, 당신이 만든 편집은 완벽하게 작동했습니다. – Alan

관련 문제