find、xargs、およびmv:二重引用符を使用したファイル名の変更、拡張子、およびbash優先順位の問題

find、xargs、およびmv:二重引用符を使用したファイル名の変更、拡張子、およびbash優先順位の問題

さて、ファイル名から二重引用符を削除したいと思います。以下は私が思いついたコマンドです(bash)。

$ find . -iname "*\"*" -print0 | xargs -0 -I {} mv {} {} | tr -d \"

問題は'mv {} {} | tr -d \"'部品にあります。私はそれが優先順位の問題だと思う:bashはと解釈されるようで(mv {} {}) | tr -d \")、私に残ったのは二重引用符が削除されたファイル名だけです。明らかに、これはファイルの名前を変更できないので、私が望むものではありません。代わりに、次のように、最初のファイル名に引用符を含め、2番目のファイル名に引用符を含めないようにしますmv {} ({} | tr -d \")

この目標をどのように達成できますか?私は角かっこと中かっこを使ってみましたが、コマンドの実行優先順位を明示的に設定するときに何をするのかわかりません。

ベストアンサー1

これがインストールされているとし、rename次を使用します。

find . -name '*"*' -exec rename 's/"//g' {} +

このrenameコマンドはPerl式を使用して新しい名前を生成します。s/"//g名前のグローバル置換を実行して、すべての引用符を空の文字列に置き換えます。

これを行うには、mvサブコマンドを実行できるようにシェルコマンドにパイプする必要があります。

find . -name '*"*' -exec sh -c 'mv "$0" "$(printf %s "$0" | tr -d "\"")"' {} \;

xargsあなたが書いたものはtoの出力をパイプとして使用し、toの引数を設定するためにはtr使用されません。trmv

おすすめ記事