2016-07-22 12 views
0

ファイル名が001.mp3、002.mp3、...、030.mp3の複数のmp3ファイルを含む一連のディレクトリがあります。-execでコマンドを実行する前にfindの出力をソート

私がしたいのは、それらをまとめて1つのmp3ファイルにまとめて、そこにいくつかのメタデータを追加することです。

#!/bin/bash 
for d in */; do 
    cd $d 
    find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 
    cd .. 
done 

は時々、この作品と私は、正しい順序ですべての「トラック」を持つ単一のファイルを取得:

は、ここで私は(明確にするため、いくつかの変数定義を削除)現時点で持っているものです。

しかし、私はすべての "トラック"が逆の順序で1つのファイルを取得することがよくありますが、これは実際には良くありません。

私が理解できないのは、すべてのディレクトリに同じファイル名が含まれているため、スクリプトの実行によって順序が異なる理由です。私はマニュアルページを読みましたが、findのソートオプションを見つけることができません。

私はfind . -iname '*.mp3' | sort -n >> temp.txtを実行してファイルを一時ファイルに入れてからそれを試してみることができますが、私はそれをラメで使うことができません。

findがexecを実行する前に並べ替えを行う方法はありますか?私はここで多くの例を見つけることができ、-exec lsでこれをやっていますが、どこでもっと複雑なものをexecで実行する必要があるかはわかりません。

+0

ここに私自身のbash能力の境界を押しても、私は 'findのようなことをすることができます。 -iname '* .mp3' |ソート-n | xargs '?もしそうなら、私はどのように入力を取るためにラメコマンドを再配置するだろうか? – yknivag

+0

temp.txtには完全なパスまたは一連のファイル名のみが含まれていますか? –

+0

可能であれば、私はむしろ一時ファイルを全く使用しません。しかし、それはおそらく任意のタイプのファイル名を含むように構築することができます。 – yknivag

答えて

1
find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 
未テスト

が、試してみる価値があるかもしれません。

通常、xargsは、コマンドの最後に引数を追加します。 -Iオプションは、代わりに指定された文字列(この場合は{})を置き換えるように指示します。


編集:私は、パイプラインはまだあなたのファイル名が改行が含まれている場合でも動作することを確認するために-print0-z-0を追加しました。

+0

デフォルトでソートが改行で区切られたレコードを返すので、 'sort -n'を' sort -zn'に変更します。 – oakymax

+0

編集を提案できません - 少なくとも6つのシンボルを追加する必要があります)) – oakymax

+0

@melpomeneありがとうございます!これは完全に機能します。 – yknivag

関連する問題