7日後のディレクトリを削除

7日後のディレクトリを削除

私は私のディレクトリに毎日バックアップファイルを作成します。

2020-04-01
2020-04-02
2020-04-03

まもなく

古いディレクトリとその内容を削除するコードを書く方法。これまでのところ、ディレクトリを削除するための以下のコードがありますが、それほどスマートではありません。あるディレクトリから別のディレクトリにファイルをコピーすると、変更日が変更されます。

find ~/delete/* -type d -ctime +6 -exec rm -rf {} \;

答え1

ディレクトリ名でディレクトリを削除するには、次の手順を実行しますbash

#!/bin/bash

shopt -s nullglob
date=$(date -d '-7 day' '+%F')
for path in ~/delete/[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]; do
  if [[ -d $path && ${path##*/} < $date ]]; then
    echo rm -rf "$path"
  fi
done

これは、YYYY-MM-DDパターンと一致するパス名を繰り返し、ディレクトリではなく、名前が現在の日付(7日前)以前にアルファベット順にソートされていないディレクトリをスキップします。

有効にすると、nullglob一致するファイル/ディレクトリがなく、ループ内のコードが実行されない場合、パス名パターンは空の文字列に展開されます。

出力が期待どおりに表示されたら、echoスクリプトを削除してやり直して実際にディレクトリを削除してください。

答え2

実際にはタイムスタンプが使用できず、名前を信頼する必要があるため、タイトルが少し誤解を招く可能性があります。

考えられる解決策

keepAfter=$(date -d '-6 days' +'%F')
for d in */
do 
    [[ "$d" < "$keepAfter"/ ]] && echo rm -rf $d 
done

echo結果に満足したら削除

答え3

別の解決策:

d=/path/to/deleted;
printf '%s\n' $d/*/ | awk -v upTo="$d/$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r 

遅い:

  • printf '%s\n' $d/*/各行がサブディレクトリであるストリームを作成します。/path/to/deleted(この行にはフルパスが含まれています/path/to/deleted/2020-04-12。)
  • これはawk次に渡されます。

    • -v upTo="$d/$(date -d '-6 days' +%F)"upTo:削除する最新のディレクトリである変数を作成します(フルパスを含む/path/to/deleted/2020-04-12)。
    • '$0<=upTo {print}'awkアルファベット順に内容以下の入力行のみを印刷するプログラムなので、upTo休憩日以降のディレクトリをフィルタリングします。
  • xargs rm -rrm -r標準入力(つまり、フィルタリングされていないディレクトリ)からのすべての行に適用されます。

このコードの利点は、シェルループがなく、rmすべてのディレクトリに対して一度だけ呼び出すことができることです。

最初に行うと、cd /path/to/deletedコードは少し簡単になります(もはや$d変数は必要ありません)。

printf '%s\n' */ | awk -v upTo="$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r 

関連情報