id3v2はコマンドラインで再帰的に使用されますか?

id3v2はコマンドラインで再帰的に使用されますか?

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 {} +

関連情報