N分より古いファイルを削除するスクリプトがあります。スクリプトはデフォルトで次のように実行されます。
find /some-folder/* -mmin +59 | xargs rm -rf
しかし、何らかの理由で、次のような内容がたくさん印刷されます。 No such file or directory
しかし、仕事が完了したようです。以下の例をご覧ください。
$ du -hs /opt/storage/
5.2G /opt/storage/
$ find /opt/storage/* -mmin +59 | xargs rm -rf
find: /opt/storage/caches/modules-2/files-2.1/org.jboss/jboss-parent: No such file or directory
find: /opt/storage/caches/modules-2/files-2.1/redis.clients: No such file or directory
find: /opt/storage/caches/modules-2/files-2.1/org.infinispan: No such file or directory
...
$ du -hs /opt/storage/
4.0K /opt/storage/
find
xargs
存在しないファイルを見つける原因のアイデアはありますか?ある種の競合状態があるため、ファイルが発見/ログに印刷される前に何らかの方法で削除された可能性がありますか?
おそらく関連があるかもしれません: https://www.linuxquestions.org/questions/linux-newbie-8/find-exec-with-rm-gives-unnecessary-error-747473/#post3646393
しかし、解決策はxargs
私がやっていることを使うことです。
修正する:以下のコメントによると、ファイルを削除すると親フォルダの修正時間が更新されるのが問題のようです。さらに、削除プロセス中に同じ親/開始フォルダの下にファイルとフォルダが作成されることがあります。
この記事には次の例があります。 https://stackoverflow.com/a/13869000/363603
代わりに使用してくださいctime
。しかし、以下から:
https://www.webservertalk.com/linux-touch-command
変更時刻ファイルのメタデータ、属性、またはコンテンツが最後に変更された時刻。
これは同じ問題を引き起こします。
find
以下で使用できる場合--time=birth
:
https://unix.stackexchange.com/a/567590/11740
これはおそらく最も強力なソリューションです。しかし、これまでこれの例を見つけることができませんでした。
もしそうなら、Linuxには、スタートアップフォルダでファイル保存を繰り返し(日付しきい値に基づいて)繰り返し実行する「標準」方法はありません。一方、サブツリーの一部は削除/保存中に更新できますか?
現在のソリューション: これまでに見つかった内容に基づいて、削除するすべてのファイルを検索し、削除を実行するように分類しました。
# Store path to all files that should be deleted (potentially a lot!)
FILES_TO_DELETE=$(find /some-folder/* -mmin +59)
# Delete the file
rm -rf $FILES_TO_DELETE
答え1
ディレクトリとその内容を削除してから存在しなくなった内容を削除するため、エラーメッセージが表示されます。
変更時間に基づいてディレクトリを削除するのはおそらく良い考えではないので、2段階のアプローチを好むことができます。
- ファイルの削除
- 空のディレクトリを削除
-->
find /some-folder/* -type f -mmin +59 -delete \
&& find /some-folder/* -type d -empty -delete
ファイルとディレクトリを本当に削除するには、削除-prune
されたディレクトリに移動せずに使用できます。
find /some-folder/* -mmin +59 -exec rm -rf {} \; -type d -prune
を使用するには-delete
(ファイルのみ)またはを-exec rm -rf {} \;
使用し、nullで区切られた出力を使用するように選択する必要があります。これらのオプションの一部は、そのバージョンでは使用できない場合があります。xargs ...
xargs
-print0
xargs -0
find