2017-10-27 8 views
1

ffmpegとフォルダ/ファイル名のスペースに問題があります。私のコードは次のようになります:bash ffmpegファイル名の空白と検索

cd /volume1/PUBLIC/Musik/AutoConvert 
find . -type d -exec mkdir -p -- /volume1/PUBLIC/Musik/Converted/{} \; 
find -type f |sed 's|./||' |while read NEWNAME; do 
ffmpeg -i ""/volume1/PUBLIC/Musik/AutoConvert/"$NEWNAME""" -codec:a libmp3lame -qscale:a 2 "/volume1/PUBLIC/Musik/Converted/"${NEWNAME%.[Ff][Ll][Aa][Cc]}".mp3" 
echo done with file: "$NEWNAME" 
done 

しかし、スペースがあればffmpegで失敗します。私のフォルダ構造は次のようになります。

[email protected]:/volume1/PUBLIC/Musik/AutoConvert$ find -type f |sed 's|./||' 
A B/C.mp3 
A B/C D.mp3 
A/C D.mp3 
A/C.mp3 

/Converted/A/C.mp3は機能しますが、それだけです。フォルダ内の他のすべてのファイル名に失敗します。

[NULL @ 0x20bb3e0] Unable to find a suitable output format for '/volume1/PUBLIC/Musik/Converted/A/C' 
/volume1/PUBLIC/Musik/Converted/A/C: Invalid argument 
done with file: A/C D.mp3 

[NULL @ 0x11bf280] Unable to find a suitable output format for '/volume1/PUBLIC/Musik/Converted/A' 
/volume1/PUBLIC/Musik/Converted/A: Invalid argument 
done with file: A B/C D.mp3 

[NULL @ 0x11f93e0] Unable to find a suitable output format for '/volume1/PUBLIC/Musik/Converted/A' 
/volume1/PUBLIC/Musik/Converted/A: Invalid argument 
done with file: A B/C.mp3 

私はエラーを取得-input ffmpegの上の「二重使用しない場合:

/volume1/PUBLIC/Musik/AutoConvert/A: Is a directory 
done with file: A B/C.mp3 

/volume1/PUBLIC/Musik/AutoConvert/A: Is a directory 
done with file: A B/C D.mp3 

/volume1/PUBLIC/Musik/AutoConvert/A/C: No such file or directory 
done with file: A/C D.mp3 

私は正しい軌道に乗ってるようですが、ちょうどあまりにも遠くから...見えますが私の目標。

誰でもいくつかの助けを提供することはできますか?

+1

なぜでしょうか?/ volume1/PUBLIC/Musik/AutoConvert/$ NEWNAME "...."/volume1/PUBLIC/Musik/Converted/${NEWNAME%.[Ff][Ll][Aa][Cc] } .mp3 "'?変数の値はスペースで** **囲む必要があります。二重引用符で囲みます。幸いです。 – shellter

+1

なぜ '。/'接頭辞を取り除くのではなく、 'find'を最初に置かないように伝えるのですか?たとえば、 'find。 -type f -printf '%P \ 0' | IFS = read -r -d '' 'は'。/ '接頭辞を持たない(何かを傷つけるわけではない)。 –

+1

'' ''は絶対に何もしません*:クォートするコンテキストを開始し、すぐに終了するので、周囲のコードがどのように解析されるかには何の効果もありません。 –

答えて

1

を多分このコードはあなたに

#!/bin/bash 
cd /volume1/PUBLIC/Musik/AutoConvert 2>/dev/null || { echo "The folder is unavailable."; exit 1; } 
find . -type d -exec mkdir -p -- /volume1/PUBLIC/Musik/Converted/{} \; 
while IFS= read -r -d $'\0' NEWNAME; do 
    ffmpeg -i "/volume1/PUBLIC/Musik/AutoConvert/$NEWNAME" -codec:a libmp3lame -qscale:a 2 "/volume1/PUBLIC/Musik/Converted/${NEWNAME%.*}.mp3" 
    echo "done with file: $NEWNAME" 
done < <(find . -iname '*.flac' -printf '%P\0') 
を助けることができます
+0

おそらく、FLAC以外のファイルを入力として扱わないように(そして拡張子を取り除いたパラメータ拡張が失敗するように)、 'find'に' --iname '* .flac''があるはずです。 –

+0

私は(http://shellcheck.net/のように) '|| 'cd'で' exit'を実行するので、 '/ volume1/PUBLIC/Musik/AutoConvert'が利用できない場合、間違ったディレクトリで実行し続けます。 –

+0

あなたは正しいです、はるかに良いです。完璧です。 –

関連する問題