test*.txt
私はRed Hat Enterprise Linux Serverバージョン7.5(Maipo)で10日前6ヶ月前に指定されたすべてのファイルを見つけるスクリプトを作成しています。コピーした元のディレクトリには有効なファイルが含まれていますが、ファイルを移動しようとするとエラーが発生します。スクリプトとエラーメッセージは次のとおりです。なぜ失敗し、それを解決するにはどうすればよいですか?
find /INTER/f/d/o/ -type f -name "test*.txt" -mtime +190 -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;
mv: target /INTER/f/d/o/test1.txt is not a directory
mv: target /INTER/f/d/o/test2.txt is not a directory
mv: target /INTER/f/d/o/test3.txt is not a directory
mv: target /INTER/f/d/o/test4.txt is not a directory
また、ファイルがアーカイブディレクトリに7か月10日間アーカイブされた後に削除します。以下のスクリプトを使用すると、次のエラーが発生します。
find /INTER_ARCHIVE/f/d/o/ -type f -name "test*.txt" -mtime +400 -exec rm {};
find: missing argument to `-exec'
答え1
最初のコマンド:
find /INTER/f/d/o/ -type f -name "test*.txt" -mtime +190 -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;
ここでは、パターンに一致し、十分に古いファイルを見つけたものに移動すると仮定します。命令mv
ビット形式が正しくありません。次のようにする必要があります。
-exec mv {} /some/destination/path \;
つまり、「見つかったファイル({}
)を任意のターゲットに移動する」ということです。
ファイルを移動する場所はコマンドで明確ではありませんが、作成するとファイルが移動されます。到着パス名が見つかりました。mv
複数のファイルをディレクトリ以外の場所に移動しようとすると失敗します。
2番目のコマンドでは
find /INTER_ARCHIVE/f/d/o/ -type f -name "test*.txt" -mtime +400 -exec rm {};
引数を正しく終了できませんでした-exec
。最後のビットは次のようにする必要があります
-exec rm {} \;
または単に
-delete
実装がfind
それをサポートしている場合。
皆さんも見てください」「find」の-execオプションについて」。
答え2
最初のコマンド:
find ... -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;
mv
引数/INTER/f/d/o/test*.txt
(文字通りアスタリスクを含む)に渡され、現在/INTER_ARCHIVE/f/d/o/
処理find
中のファイルに渡されます。mv
3つのパラメータが表示されるため、最初の2つを3番目のパラメータに移動し、3番目のパラメータをディレクトリにする必要があります。
コマンドはシェルを介して実行されないtest*.txt
ため、一致するファイル名には拡張されません(シェルを使用する必要があります)。ワイルドカードはここで違反するので、とにかくそれをしたくありません。find
-exec
-exec sh '...' \;
test*.txt
-mtime
おそらくあなたが望むもの
find ... -exec mv {} /INTER_ARCHIVE/f/d/o/ \;
find
現在処理中のファイルをに移動します/INTER_ARCHIVE/f/d/o/
。
またはGNUを使用してくださいmv
:
find ... -exec mv -t /INTER_ARCHIVE/f/d/o/ {} +
1回の呼び出しで複数のファイルを処理しますmv
。