web-dev-qa-db-ja.com

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

Id3タグをクリーンアップしようとして、コマンドラインでid3v2を愛しています-しかし、私は* .mp3ワイルドカードでのみ使用しており、すべてをバッチ処理できるように再帰的に使用する方法があるかどうかを調べたいと思っています私のMP3。再帰的に使用するオプションはないようです。

私はあなたの素晴らしいコマンドラインの人々がこれを行うための甘い方法を知っていると確信していますが、私はまだそれを通して私の方法を学んでいます...

これが、ブルートフォース攻撃のためにエイリアスしたコマンドです。

id3v2 --remove-frame "COMM" *.mp3
id3v2 --remove-frame "PRIV" *.mp3
id3v2 -s *.mp3

つまり、これを再帰的に実行して、音楽フォルダのルートで実行できるようにする方法はありますか?グレイビーポイント:他のオーディオファイルタイプを含め、上記の3つのコマンドすべてを1つのuberコマンドに折りたたむ(コマンド間の;でこれを行うことができます...そうですか?)

5
chow

これは、次のように1行で実行できるはずです。

find . -name '*.mp3' -execdir id3v2 --remove-frame "COMM" '{}' \; -execdir id3v2 --remove-frame "PRIV" '{}' \; -execdir id3v2 -s '{}' \;

{}は、現在一致するファイル名の代わりに使用されます。それらを引用符で囲みます('')シェルからそれらを保護します。 -execdirはセミコロンに達するまで実行されますが、セミコロン(;)シェルからエスケープする必要があるため、バックスラッシュ(\)。これはすべてfindmanpage で説明されています:

-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...

これには少し慣れていないように思われるので、注意点:複雑なシェルコマンドの場合と同様に、慎重に実行して、テストを試してください。最初にディレクトリを作成して、何が起こるかを確実に理解してください。大きな力には大きな責任が伴います!

5
ire_and_curses

簡単な解決策は、すべてのサブフォルダーをループし、その中のすべてのファイルを処理することです。

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
2
daisy

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