フォルダとその中のファイルの検索と削除

フォルダとその中のファイルの検索と削除

次のディレクトリ構造があります。

/backups/
/backups/db/
/backups/db/01.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/02.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz

次に、次のコマンドを実行します。

find /backups/db/ -mindepth 1 -mtime +2 -delete && rsync ...

このコマンドをシェルから直接実行すると動作し、結果は次のようになります。

/backups/
/backups/db/
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz

cronjobを介してこのコマンドを実行すると、ディレクトリは削除されず、結果は次のようになります。

/backups/
/backups/db/
/backups/db/01.01.2020/
/backups/db/02.01.2020/
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz

これはfind、この(2)フォルダ内のファイルが最初に削除され、この操作のためにそのフォルダの日付が変更されたことになります-mtime +2

解決策はありますか?私の言うことは、私はこのようなことは大丈夫ですが、必要でなければ通常rmで作業するのが好きではないということです。

find /backups/db/ -mindepth 1 -mtime +6 -type d -exec rm -r {} +

検索(GNU findutils) 4.7.0-git

ベストアンサー1

これは2つのステップで行い、削除のみを行うことをお勧めします。文書最初のステップ:

find /backups/db -mindepth 1 -type f -mtime +2 -delete

その後、空のディレクトリを削除します。

find /backups/db -mindepth 1 -type d -empty -delete

これにより、ディレクトリのタイムスタンプをまったく比較する必要がなくなります。

これら2つの操作を次のように組み合わせることができます。

find /backups/db -mindepth 1 \
    \( \( -type f -mtime +2 \) -o \
       \( -type d -empty    \) \) -delete

-delete...しかし、まず正しいことをしていることを確認したいかもしれません。

おすすめ記事