NASでいくつかのファイルを見つけてから5日後のファイル/フォルダを削除しようとしています。 find コマンドを使用できます。
find /volume1/docker/UV/videos -type f -print
次に、ビデオフォルダとサブディレクトリからすべてのファイルをインポートします。
しかし、私が試した場合:
find /volume1/docker/UV/videos -mtime +2 -print
それから何も起こりません。 2日より古いファイルがあることを知っていて、2を1に変更すると同じことが起こります。
したがって、2日より古いファイルを含むファイルとサブディレクトリのリストを取得できません。私が望むのは、ファイル/フォルダを見つけて、-printを-deleteに変更することです。しかし、-printを使用しているので、結果がどうなるかはわかりますが、結果は何もありません。
誰でも私を助けたり案内したりできますか?
答え1
問題は-atime
、オプション-ctime
が-mtime
予期しない丸めを実行することです。説明はにあります。man find
以下-atime
:
-atime n
最後にアクセスしたファイルN *24時間前。いつ
find
一致する小数部を無視し、ファイルに最後にアクセスした24時間前の期間を計算します。-atime +1
、少なくともファイルにアクセスしたことがあるはずです。二つ数日前。
最新バージョンには代替方法がありますfind
。
-mmin
(および変形)日単位ではなく分単位に丸められます。したがって、-mmin "+$(( 60*24*2 ))"
2日前の現在時刻に基づいて作業します。
-daystart
時間は当日00:00:00に基づいて測定されます。これは非常に不正確なツールであり、コマンドラインのオプションの順序に敏感です。
これらの最新の拡張機能を持たないシステムfind
(SolarisやAIXなど)を使用している場合、またはすべての管理タスクに必須の深夜期限があり、実行されるたびに他の期限を指定したくない場合は、参照ファイルを使用してください。良い選択。
Paul--) touch -t 202009020301 FileToRetain
Paul--) touch -t 202009020300 FileOnCusp
Paul--) touch -t 202009020259 FileToDelete
Paul--)
Paul--) touch /tmp/myRefFile -t $( date -d '4 days ago' '+%Y%m%d0300' )
Paul--) ls -ltr /tmp/myRefFile .
-rw-r--r-- 1 paul paul 0 Sep 2 03:00 /tmp/myRefFile
.:
total 0
-rw-r--r-- 1 paul paul 0 Sep 2 02:59 FileToDelete
-rw-r--r-- 1 paul paul 0 Sep 2 03:00 FileOnCusp
-rw-r--r-- 1 paul paul 0 Sep 2 03:01 FileToRetain
Paul--) find . -type f ! -newer /tmp/myRefFile -delete
Paul--) ls -ltr /tmp/myRefFile .
-rw-r--r-- 1 paul paul 0 Sep 2 03:00 /tmp/myRefFile
.:
total 0
-rw-r--r-- 1 paul paul 0 Sep 2 03:01 FileToRetain
Paul--)
参照ファイルはクリーンアップされているディレクトリにあってはいけません(面白い瞬間に独自に削除される可能性があります)、本番環境では、使用前に同時使用のmktemp
問題を回避するためにPIDを使用するか、名前の一部としてPIDを含める必要がありますrm
。
もちろん現代車がなければ、find
おそらくそうではないでしょうdate -d
。私の管理は月単位であるため、Solarisでは月末やうるう年ではなく月/年のオーバーフローをスクリプトする必要があります。ただ dd=01 に設定するだけです。しかし、特定の曜日や月に自分を合わせることも、きれいに行うことができないfind
もう一つのことです。date -d 'last Sunday 06:00'
参照文書になるのが役立ちます。
答え2
find path -type f -daystart -mtime +5 -exec rm -rvf {} \;