ファイル名の文字列を置き換えるためにfindとsedを使用するのが難しい

ファイル名の文字列を置き換えるためにfindとsedを使用するのが難しい

次のようなこの投稿注: エラーなしでfindand コマンドを実行できますが、ファイル名は同じままです。sed

服を脱がせようとしていますの発音_de_現在のディレクトリのすべてのmp3:

pronunciation_de_wählen.mp3
pronunciation_de_wange.mp3
pronunciation_de_weil.mp3
pronunciation_de_werden.mp3
pronunciation_de_zentrum.mp3

コマンドの問題を解決する前にクイックステータスチェック: find . -name "*.mp3"
現在のディレクトリのすべてのmp3を返します。これでこの部分がうまくいくことがわかりました。

sed --version返品sed (GNU sed) 4.4

私は走るfind . -name "*.mp3" -exec sed -i 's/pronunciation_de_//g' {} \;

何が起こっているのか完全に理解していることを確認するには、次の手順を実行します。

find .走る探す現在のディレクトリのコマンドです。
-name "*.mp3"すべての.mp3ファイル形式を返します。
-exec入力してコマンドを実行します。
sed -iこれ-私遷移とは、(一時的な)コピーではなく、実際のファイルで作業することを意味します。

のため's/old_word/new_word/g'

  • これSsedを代替モードに設定します。
  • /古い単語交換したい言葉です。
  • /新しい単語交換したい言葉です。私の例では空です。
  • / G最初の一致だけでなく、すべての一致に置換を適用します。

{}この文字列は、各反復中にファイル名に置き換えられます。
\;セミコロン終了探す注文する。バックスラッシュはセミコロン文字をエスケープし、シェルが文字通り解釈するのを防ぎます。

私はこの情報のほとんどをランダムなブログとStack Exchangeの投稿から入手します。

-exec オプションについてfind
findの-execコマンドで{} +はどういう意味ですか?

ほぼ確実に重複するこの質問を投稿する前に、時間をかけて実験して調査したいのですが、完全に詰まっています!

ベストアンサー1

find -exec ...1行のシェルスクリプトを使用して交換を実行できます。

find . -name "*.mp3" -type f -exec bash -c 'mv "$1" "${1/pronunciation_de_}"' bash {} \;

ファイル名は実行中のbashプロセスにパラメータ{}として渡され、bashのパラメータ拡張機能が使用され、inが最初に表示される場合は空の文字列に置き換えられます。$1${1/pronunciation_de_}pronunciation_de_$1

追加オプションを使用すると、通常のファイルのみが一致する-type fことを確認できます。

おすすめ記事