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

答え2

xargs -0 -I {} mv {} {} | tr -d \"

意味なし:mv出力を生成しません。したがって、使用できませんmv

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

またはより少ないオーバーヘッドで

find . -name '*"*' -exec bash -c 'for file in "$@"; do mv "$file" "${file//\"/}"; done' bash {} +

答え3

あなたもできます...

mkdir ../_cp
pax -Xwrl -s'/"//gp' . "${PWD%/*}/_cp"

.これにより、を指す複数のポイントが作成されます../_cp。その後、両方のディレクトリのいずれかを削除する前に、両方のディレクトリに問題がないことを確認できます。を含まないことを除いて、最終的にほぼ同じディレクトリです"

関連情報