さて、ファイル名から二重引用符を削除したいと思います。以下は私が思いついたコマンドです(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
使用されません。tr
mv