再帰的にフォルダ名を @eaDir に変更します。

再帰的にフォルダ名を @eaDir に変更します。

GitHubで見つけたサムネイルジェネレータPythonスクリプトを使用しようとしていますが、それは本当にうまくいきます。

名前付きフォルダにサムネイルを作成し、端末でeaDir_tempNASの名前を変更する必要があります@eaDir。著者はこれに対して次のコマンドを提供します。

find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;

残念ながら、写真を含むすべてのサブフォルダに対して以下が返されます。

mv: cannot move ‘./subfolder/eaDir_tmp’ to ‘@eaDir/eaDir_tmp’: Directory not empty

私は何をすべきですか?

答え1

気になる人のために何が起こるのか:コマンド

find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;

見つかった各./whatever/eaDir_tmpディレクトリ(コンポーネントなど)eaDir_tmpを現在の作業ディレクトリに移動します。./whatever/eaDir_tmp./@eaDir。 (パスコンポーネントは現在の作業ディレクトリに基づい@eaDirていると見なされるためです。)mv

最初は./@eaDirまだ存在しない場合に生成されます。

2番目に./whatever/eaDir_tmp見つかったのは引っ越しました入力する ./@eaDir、なぜなら、この時点で与えられたターゲットディレクトリmv()がすでに存在するからです:→。@eaDir./whatever/eaDir_tmp./@eaDir/eaDir_tmp

追加の検索も./subfolder/eaDir_tmp行われます。このステップはすでに存在し、空ではないため失敗します。./@eaDir./@eaDir/eaDir_tmp


あなたができること:find実装が以下をサポートしている場合-execdir

find . -depth -type d -name 'eaDir_tmp' -execdir mv '{}' @eaDir \;

-deptheaDir_tmpこれは、実際にネストされたディレクトリ(たとえば)の場合にのみ必要です./whatever/eaDir_tmp/whatever/eaDir_tmp

代わりに-exec、現在の作業ディレクトリではなく一致-execdirするファイルを含むディレクトリでfind指定されたコマンドを実行します。

find非標準をサポートしていない場合-execdir:

find . -depth -type d -name 'eaDir_tmp' \
  -exec sh -c 'mv "$1" "${1%/*}/@eaDir"' mysh {} \;

または、見つかったすべてのディレクトリに対してシェルを起動しないでください。

find . -depth -type d -name 'eaDir_tmp' -exec sh -c '
  for dir
  do
    mv "$dir" "${dir%/*}/@eaDir"
  done' mysh {} +

関連情報