0

このスクリプトのコンパイルには時間がかかりすぎました (!!) が、最終的には、必要な機能を備えた適切なスクリプトを作成できました。

find "$@" -type d -print0 | while IFS= read -r -d $'\0' dir; do
    find "$dir" -iname '*.flac' -maxdepth 1 ! -exec bash -c '
        metaflac --list --block-type=VORBIS_COMMENT "$0" 2>/dev/null | grep -i "REPLAYGAIN_ALBUM_PEAK" &>/dev/null
        exit $?
    ' {} ';' -exec bash -c '
        echo Adding ReplayGain tags to "$0"/\*.flac...
        metaflac --add-replay-gain "${@:1}"
    ' "$dir" {} '+'
done

目的は、ファイル ツリーで FLAC ファイルを含むディレクトリを検索し、REPLAYGAIN_ALBUM_PEAKタグが欠落しているかどうかをテストし、欠落している場合はそのディレクトリ内のすべてのファイルをスキャンして ReplayGain を検出することです。

大きな障害は、特定のアルバムのすべての FLAC ファイルを 1 つのコマンドとして metaflac に渡す必要があることです。ご覧のとおり、 を使用してこれを達成しましたfind ... -exec ... +

私が疑問に思っているのは、これを行うためのよりエレガントな方法があるかどうかです。while特に、ループをスキップするにはどうすればよいですか? findすでにディレクトリを反復処理しているため、これは不要なはずです。

4

2 に答える 2

1

おそらくxargsを使用してそれを達成できます。

たとえば、すべてのファイルでテキストfooを探している場合は、次のようになります。

find . type f | xargs grep foo

xargsは、左端の式 ( find ) からの各結果を右端の呼び出されたコマンドに渡します。

次に、やりたいことを達成するためのコマンドが存在しない場合は、いつでも関数を作成し、if をxargsに渡すことができます。

于 2013-02-17T14:37:40.093 に答える
0

私はflacコマンド自体についてコメントすることはできませんが、残りについては:

find . -name '*.flac' \
 ! -exec bash -c 'metaflac --list --block-type=VORBIS_COMMENT "$1" | grep -qi "REPLAYGAIN_ALBUM_PEAK"' -- {} \; \
  -execdir bash -c 'metaflac --add-replay-gain *.flac' \;

関連するファイルを見つけて、それが含まれているディレクトリを処理するだけです。

于 2013-02-17T17:57:03.417 に答える