Id3タグをクリーンアップしようとして、コマンドラインでid3v2を愛しています-しかし、私は* .mp3ワイルドカードでのみ使用しており、すべてをバッチ処理できるように再帰的に使用する方法があるかどうかを調べたいと思っています私のMP3。再帰的に使用するオプションはないようです。
私はあなたの素晴らしいコマンドラインの人々がこれを行うための甘い方法を知っていると確信していますが、私はまだそれを通して私の方法を学んでいます...
これが、ブルートフォース攻撃のためにエイリアスしたコマンドです。
id3v2 --remove-frame "COMM" *.mp3
id3v2 --remove-frame "PRIV" *.mp3
id3v2 -s *.mp3
つまり、これを再帰的に実行して、音楽フォルダのルートで実行できるようにする方法はありますか?グレイビーポイント:他のオーディオファイルタイプを含め、上記の3つのコマンドすべてを1つのuberコマンドに折りたたむ(コマンド間の;
でこれを行うことができます...そうですか?)
これは、次のように1行で実行できるはずです。
find . -name '*.mp3' -execdir id3v2 --remove-frame "COMM" '{}' \; -execdir id3v2 --remove-frame "PRIV" '{}' \; -execdir id3v2 -s '{}' \;
{}は、現在一致するファイル名の代わりに使用されます。それらを引用符で囲みます(''
)シェルからそれらを保護します。 -execdir
はセミコロンに達するまで実行されますが、セミコロン(;
)シェルからエスケープする必要があるため、バックスラッシュ(\
)。これはすべてfind
manpage で説明されています:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find.
-execdir command {} +
Like -exec, but the specified command is run from the subdirec‐
tory containing the matched file, which is not normally the
directory in which you started find. This a much more secure
method for invoking commands...
これには少し慣れていないように思われるので、注意点:複雑なシェルコマンドの場合と同様に、慎重に実行して、テストを試してください。最初にディレクトリを作成して、何が起こるかを確実に理解してください。大きな力には大きな責任が伴います!
簡単な解決策は、すべてのサブフォルダーをループし、その中のすべてのファイルを処理することです。
find . -type d | while IFS= read -r d; do
cd "${d}"
id3v2 --remove-frame "COMM" *.mp3
id3v2 --remove-frame "PRIV" *.mp3
id3v2 -s *.mp3
cd -
done
id3v2
を使用していないのでわかりませんが、すべてのコマンドを1つにまとめることができる可能性は十分にあります。
id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s *.mp3
サブディレクトリのMP3ファイルでもこのコマンドを実行するには、次のコマンドを実行します。
id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s **/*.mp3
**/*.mp3
は、現在のディレクトリとそのサブディレクトリ内の.mp3
ファイルと再帰的に一致します。シェルがzshの場合、**/
はそのままで機能します。シェルがbash≥4の場合、最初にshopt -s globstar
を実行する必要があります(この行を~/.bashrc
に入れてください)。 kshでは、set -o globstar
を実行する必要があります(~/.kshrc
に入れます)。別のシェルがある場合、またはコマンドラインが大きすぎることを通知するメッセージでこの試行が失敗した場合は、以下のfind
メソッドを使用する必要があります(他の回答に示されているようなバリアントを使用) 。
ディレクトリとそのサブディレクトリ内のファイルを再帰的に操作するための、より複雑ですが、より柔軟で移植性の高い方法は、find
コマンドです。
find . -type f -name '*.mp3' -exec id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s {} +
-exec
の後のコマンドは、最後の{} +
ビットが一致するファイルへのパスに置き換えられて実行されます。複数のid3v2
コマンドを実行する必要がある場合は、複数の-exec
ディレクティブを使用してください。
find . -type f -name '*.mp3' -exec id3v2 --remove-frame "COMM" {} + -exec id3v2 --remove-frame "PRIV" {} + -exec id3v2 -s {} +