いくつかのディレクトリを作成するために単純なスクリプトを使用しています。名前で特定のファイルを見つけ、私が作成したディレクトリに移動します。私が使用するコードは次のとおりです。
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
。これに対してできることはいくつかあります。
- 検索スペースからディレクトリを除外します
find . -name '*.template' -path "./3DBGB_run" -prune -o -exec mv -i {} ./3DBGB_run \;
。-path
セクションはコンテンツを移動したいディレクトリと一致し、-prune
次に、再帰からツリー全体を除外します。-o
残りのコマンド(ソース-exec
)が残りの時間実行されるようにします。このコマンドは、ディレクトリ内のファイルでは実行されません。 (これはマニュアルの明示的な例です。牛に似た一種の栄養find
) 引越し前にチェックリストを作成してみてください。場合によってはこれがより良いかもしれませんが、ファイル名にスペースやその他の内容が含まれている場合
IFS
キャラクターの場合、効果があまり良くありません。これが適用されない場合は、次のようになります。files=$(find . -name '*.template') mv "${files[@]}" 3DBGB_run
動作します。
代わりにコマンドを終了すると、find -exec
最小限のコマンドが実行され、各実行で複数の引数が収集されるため、より効率的です。時にはこれは特定のコマンドでは機能しませんが、ここでは機能します。ワンタイムコマンドは問題になりませんが、頻繁に実行している場合はプロセスを保存すると時間が節約されます。+
;
find