xargsを使用してファイルを削除すると、No such file or Directoryがたくさん印刷されます(ただし動作​​するようです...)。

xargsを使用してファイルを削除すると、No such file or Directoryがたくさん印刷されます(ただし動作​​するようです...)。

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/

findxargs存在しないファイルを見つける原因のアイデアはありますか?ある種の競合状態があるため、ファイルが発見/ログに印刷される前に何らかの方法で削除された可能性がありますか?

おそらく関連があるかもしれません: 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段階のアプローチを好むことができます。

  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-print0xargs -0find

おすすめ記事