探す。 - exec rm -rf{}とファイルが見つからないという奇妙なメッセージ[重複]

探す。 - exec rm -rf{}とファイルが見つからないという奇妙なメッセージ[重複]

バックアップを作成し、古いバックアップを削除するスクリプトがあります。次の行があります。

 find . -type d -mtime +29 -user admin -name "20*" -exec rm -rf {} \;

このようにして、29日以上バックアップされたディレクトリは削除されます。これによりディレクトリが削除されますが、次のメッセージが毎回表示されます。

find: `./2020-06-16-23-30': No such file or directory

(メッセージの日付が変更されました)

このメッセージが表示される理由とスクリプトの修正方法を教えてください。

>/dev/null 2>&1実際のエラーに関するメッセージを表示したいので、出力リダイレクト()を使用することは私には適していません。

以下は、バックアップを含むディレクトリの一覧です。

$ cd /volume1/Backup && ls -l
drwxr-xr-x  2 admin users       4096 Jun 19 23:30 2020-06-19-23-30
drwxr-xr-x  2 admin users       4096 Jun 20 23:30 2020-06-20-23-30
drwxr-xr-x  2 admin users       4096 Jun 21 23:30 2020-06-21-23-30
drwxr-xr-x  2 admin users       4096 Jun 22 23:30 2020-06-22-23-30
drwxr-xr-x  2 admin users       4096 Jun 23 23:30 2020-06-23-23-30
drwxr-xr-x  2 admin users       4096 Jun 24 23:30 2020-06-24-23-30
drwxr-xr-x  2 admin users       4096 Jun 25 23:30 2020-06-25-23-30
drwxr-xr-x  2 admin users       4096 Jun 26 23:30 2020-06-26-23-30
drwxr-xr-x  2 admin users       4096 Jun 27 23:30 2020-06-27-23-30
drwxr-xr-x  2 admin users       4096 Jun 28 23:30 2020-06-28-23-30
drwxr-xr-x  2 admin users       4096 Jun 29 23:30 2020-06-29-23-30
drwxr-xr-x  2 admin users       4096 Jun 30 23:30 2020-06-30-23-30
drwxr-xr-x  2 admin users       4096 Jul  1 23:30 2020-07-01-23-30
drwxr-xr-x  2 admin users       4096 Jul  2 23:30 2020-07-02-23-30
drwxr-xr-x  2 admin users       4096 Jul  3 23:30 2020-07-03-23-30
drwxr-xr-x  2 admin users       4096 Jul  4 23:30 2020-07-04-23-30
drwxr-xr-x  2 admin users       4096 Jul  5 23:30 2020-07-05-23-30
drwxr-xr-x  2 admin users       4096 Jul  6 23:30 2020-07-06-23-30
drwxr-xr-x  2 admin users       4096 Jul  7 23:30 2020-07-07-23-30
drwxr-xr-x  2 admin users       4096 Jul  8 23:30 2020-07-08-23-30
drwxr-xr-x  2 admin users       4096 Jul  9 23:30 2020-07-09-23-30
drwxr-xr-x  2 admin users       4096 Jul 10 23:30 2020-07-10-23-30
drwxr-xr-x  2 admin users       4096 Jul 11 23:30 2020-07-11-23-30
drwxr-xr-x  2 admin users       4096 Jul 12 23:30 2020-07-12-23-30
drwxr-xr-x  2 admin users       4096 Jul 13 23:30 2020-07-13-23-30
drwxr-xr-x  2 admin users       4096 Jul 14 23:30 2020-07-14-23-30
drwxr-xr-x  2 admin users       4096 Jul 15 23:30 2020-07-15-23-30
drwxr-xr-x  2 admin users       4096 Jul 16 23:30 2020-07-16-23-30

ベストアンサー1

これは競争条件のように見えます。

ファイルがあると言って/a/b/c実行します。find /a -exec rm -rf {} \;

場合によっては(常にそうではない)状況がこの順序で発生します。

  1. findそれに気づき、/a/b出席して覚えます。/a/b/c
  2. 起動すると、とがrm -rf /a/bすべて削除されます。/a/b/a/b/c
  3. ファイルが消えたことを知らず/a/b/c(存在しない)ファイルを削除しようとすると、エラーが発生します。

考えられる解決策:

  • できること:正規表現を使用して、No such file or directoryoutで終わる行をフィルタリングします。
  • 何が良いか:(echo最初に前に配置してテストrm -rf):
find . -type d -mtime +29 -user admin -name "20*" > /tmp/list_of_dirs
perl -ne 'system("rm -rf $_") < /tmp/list_of_dirs
  • 私が自分でやるべきこと:私はこれが本当の問題だとは思わない。特定のディレクトリが壊れているとrmわかります。

おすすめ記事