mvコマンドエラー「ファイルはすでに存在しています」

mvコマンドエラー「ファイルはすでに存在しています」

いくつかのディレクトリを作成するために単純なスクリプトを使用しています。名前で特定のファイルを見つけ、私が作成したディレクトリに移動します。私が使用するコードは次のとおりです。


mkdir ./3DBGB_run   
mkdir ./run_optimization   
mkdir ./run_optimization/project_mesh   
mkdir ./run_optimization/CFD_optimized    
find . -name '*.template' -exec mv -i {} ./3DBGB_run \;                 
find . -name '3dbgbinput.*.dat' -exec mv -i {} ./3DBGB_run \;           
find . -name 'controlinputs.*.dat' -exec mv -i {} ./3DBGB_run \;            
find . -name '*.iec' -exec mv -i {} ./run_optimization/project_mesh \;           
find . -name '*.trb' -exec mv -i {} ./run_optimization/project_mesh \;  
find . -name '*.py' -exec mv -i {} ./run_optimization \;**

コードが実行され、ファイルを目的のディレクトリに移動しますが、各ファイルに対して「同じファイルなので、ファイルを移動できません」というエラーメッセージも表示されます。

答え1

ターゲットディレクトリからの検索を避ける必要があります。たとえば、次のように追加できます! -path $TARGET_DIR

find . -name '*.template' ! -path "*3DBGB_run/*" -exec mv -it ./3DBGB_run {} \+

答え2

findファイルは2回見つかります(ファイルが始まる場所と移動する場所)。これは最終的に実行されることを意味します。

mv -i 3DBGB_run/x.template 3DBGB_run/x.template

表示されるエラーが発生します。

findファイルが「ライブ」で実行されていることを確認してください。事前にリストをビルドしてから、リスト内のすべての項目に対してコマンドを実行しません。ファイルとディレクトリを表示する順序は定義されていないため(ファイルシステムから来ることができる)、ディレクトリに移動する前に確認するすべてのファイルでこれが発生します。

find自分が何をしているのかわからないので、取り消す方法はありません-exec。これに対してできることはいくつかあります。

  1. 検索スペースからディレクトリを除外しますfind . -name '*.template' -path "./3DBGB_run" -prune -o -exec mv -i {} ./3DBGB_run \;-pathセクションはコンテンツを移動したいディレクトリと一致し、-prune次に、再帰からツリー全体を除外します。-o残りのコマンド(ソース-exec)が残りの時間実行されるようにします。このコマンドは、ディレクトリ内のファイルでは実行されません。 (これはマニュアルの明示的な例です。牛に似た一種の栄養find)
  2. 引越し前にチェックリストを作成してみてください。場合によってはこれがより良いかもしれませんが、ファイル名にスペースやその他の内容が含まれている場合IFSキャラクターの場合、効果があまり良くありません。これが適用されない場合は、次のようになります。

    files=$(find . -name '*.template')
    mv "${files[@]}" 3DBGB_run
    

    動作します。


代わりにコマンドを終了すると、find -exec最小限のコマンドが実行され、各実行で複数の引数が収集されるため、より効率的です。時にはこれは特定のコマンドでは機能しませんが、ここでは機能します。ワンタイムコマンドは問題になりませんが、頻繁に実行している場合はプロセスを保存すると時間が節約されます。+;find

関連情報