私は私のディレクトリに毎日バックアップファイルを作成します。
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 -r
rm -r
標準入力(つまり、フィルタリングされていないディレクトリ)からのすべての行に適用されます。
このコードの利点は、シェルループがなく、rm
すべてのディレクトリに対して一度だけ呼び出すことができることです。
最初に行うと、cd /path/to/deleted
コードは少し簡単になります(もはや$d
変数は必要ありません)。
printf '%s\n' */ | awk -v upTo="$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r