このmvコマンドがディレクトリに書き込もうとするのはなぜですか?

このmvコマンドがディレクトリに書き込もうとするのはなぜですか?

私はこれを文字列の検索と置換に使用しています。

find . -name 'xna*jpg' -exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}' {} \; 

これにより、「xna(2018_05_28 14_04_27 UTC).jpg」がxna.jpgに置き換えられます。

その後、ディレクトリ全体に対してこれを実行できます。ただし、このエラーが発生します。

mv: ./xna.jpg is not a directory

だからそれをしていますが、書くことはありません。なぜディレクトリを考慮するのか分からないのですか?

ベストアンサー1

-exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}'

問題は次のとおりです。コンテンツは$0スペースを含むように拡張され、mv2つ以上のパラメータが表示されます。

解決策:何かを引用してください:

-exec bash -c ' mv "$0" "${0/\ (2018_05_28 14_04_27 UTC)/}"'

find...またはまったく使用しないでください。

#!/bin/bash
# looks very similar, with less of the `shopt`ing, in zsh
shopt -s nullglob
shopt -s globstar
shopt -s dotglob
for original in "**/xna (2018_05_28 14_04_27 UTC)*jpg"; do
  newname="${original/\ (2018_05_28 14_04_27 UTC)/}"
  mv "${original}" "${newname}"
done

(必要に応じて1行にすることもできますが、ここでは簡潔さよりも読みやすさを好みます。)

おすすめ記事