2016-10-04 11 views
2

私はX265に数百のビデオを再エンコードしようとしていますが、いくつかのファイルのようにファイル名にスペースを含む多くのディレクトリがあります。私はスクリプトの束を見て、スペースと異なるディレクトリレベルで動作するものを見つけるのに苦労しています。ffmpegサブフォルダを使ったバッチ再エンコード

この1つは限り何のサブディレクトリが存在しないとして、働く:

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

私はこのbashスクリプトで動作するようにしようとしているが、それは、私は推測してい空白で失敗します。

#!/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"

あなたはbashのための適切な適切なソリューションに私を指すことができれば、私はそれをお願い申し上げます。

答えて

2

これはfindxargs

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

-print0-0スペースで名前の適切な取り扱いを確保するための典型的なシナリオです。

そして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/File with Spaces.avi:No such file or directory' – Alan

+0

@Alanこれは正しく動作しないかもしれません。多分引用符をつけてエスケープする必要があるかもしれませんが、私は現在コンピュータでテストしていません。 –

+0

ありがとう@Olaf、あなたが完璧に作業した編集。 – Alan

関連する問題