id3タグをクリーンアップしようとしていますが、コマンドラインでid3v2を使用したいと思います。しかし、*.mp3はワイルドカードと一緒にしか使われていませんでした。私のMP3。再帰的に使用できるオプションはないようです。
あなたの素晴らしいコマンドラインの人々は皆、これを行う良い方法を知っていると確信しています。しかし、私はまだコツを学んでいます...
無差別代入用に設定したaliasコマンドは次のとおりです。
id3v2 --remove-frame "COMM" *.mp3
id3v2 --remove-frame "PRIV" *.mp3
id3v2 -s *.mp3
それでは、音楽フォルダのルートで実行できるようにこの操作を再帰的に実行する方法はありますか?要点は、異なるオーディオファイル形式を含み、上記の3つのコマンドをすべて1つのuberコマンドに縮小することです。 (;
その間にあるコマンドを使ってこれを行うことができます...そうですか?)
答え1
次のように1行でこれを行うことができます。
find . -name '*.mp3' -execdir id3v2 --remove-frame "COMM" '{}' \; -execdir id3v2 --remove-frame "PRIV" '{}' \; -execdir id3v2 -s '{}' \;
{} は現在のファイル名の一致を置き換えます。引用符()で囲み、''
シェルから保護します。セミコロンが表示されるまで実行されますが、-execdir
セミコロン(;
)をシェルからエスケープする必要があるため、バックスラッシュ(\
)が使用されます。すべてそこにいるfind
マンページ:
-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...
あなたはこれについて少し新しいように聞こえるので、注意すべきこと:常に複雑なシェルコマンドを使用している場合と同様に、注意して実行し、何が起こるのかを確実に理解するために、まずテストディレクトリで実行してみてください。権利があれば大きな責任も与えられます!
答え2
簡単な解決策は、すべてのサブフォルダを繰り返し、その中のすべてのファイルを処理することです。
find . -type d | while IFS= read -r d; do
id3v2 --remove-frame "COMM" "${d}"/*.mp3
id3v2 --remove-frame "PRIV" "${d}"/*.mp3
id3v2 -s "${d}"/*.mp3
done
答え3
私はそれを使用していない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 {} +