過去3日間に作成されたディレクトリを一覧表示し、スペースの使用状況を表示します

過去3日間に作成されたディレクトリを一覧表示し、スペースの使用状況を表示します

ディスク クリーンアップの一環として、過去 3 日間 (現在の営業日ではありません) に作成されたすべてのフォルダーとそのコンテンツを削除する必要があります。

例: 今日の日付が 20191121 の場合、次のようになります。

/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*

今私にできるのはリストを取得することだけです:

ls -d */ | grep 20191118 (and then 19 and 20)

特定の日付のフォルダとそのコンテンツを削除することで、どれだけのサイズを節約できるかを確認するにはどうすればよいですか?

サーバー上の bash バージョンは次のとおりです。

bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.

答え1

ファイルやフォルダをクリーンアップするときに、 コマンドを使用するとよいでしょうdu

duドライブのスペース使用量を一覧表示します。--timeオプションがあります、そして使用することができますディレクトリのみこれらを組み合わせると:

du -h */ --time | grep -E '2019\-09\-(18|19|20)'

これにより、11 月 18 日、19 日、または 20 日に最後に作成または変更されたコンテンツを持つサブディレクトリが取得されます。サイズ (-h人間が判読できる形式)、変更日、最後にパスが出力されます。

答え2

前の回答は、rm を実行しようとするディレクトリに 5000 を超えるファイルが含まれている場合に失敗します。この場合、削除されていない古いディレクトリが残ります。

代わりに、"-exec rm {} \+" を指定した find を使用します。これにより、rm が 1 回以上呼び出され、各呼び出しで最大 5000 個の引数が使用されます。

変更されたファイル/ディレクトリを見つけるには、findを使用します。

find . -type d -atime n  # for exact number of days
find . -type d -atime +n  # for greater than n days

-daystart オプションを追加すると、24 時間前ではなく今日の初めから時間を測定できます。

次に、「-exec rm {} \+」を使用して削除するか、「-exec du -sh {} \;」を使用して各ディレクトリのディスク使用量を取得します。

また、find + du 呼び出しに -maxdepth オプションを指定して、検索を最上位レベルのディレクトリに制限することも検討してください。

詳細については、「man find」を参照してください (ターミナルから (最適) または man7.org から最新のマニュアル ページを取得します)。参考: http://man7.org/linux/man-pages/man1/find.1.htmlただし、Die.net からは取得できません (ページのタイムスタンプが削除されるため、man ページが何年古いか、時代遅れかどうかはわかりません)。

答え3

次に、@Kusalananda ソリューションの構文をはるかに短くし (私の観点から)、gdate の代わりに date を使用します (ただし、gdate は Solaris では date と同等でしょうか)。

days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
    du -s -h "$dpath/$day"
    rm -r -f "$dpath/$day"
done

答え4

Solaris システムに がある場合はbash、通常は zsh も含まれています。

この日付形式は数値のようにソートされるため、zsh の<start-end>10 進数範囲グロブ演算子を使用できます。

zsh -c '
  zmodload zsh/datetime
  now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
  for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
    strftime -s $var %Y%m%d $t
  range="<$start-$end>"
  rm -rf -- *$~range*(/)
'

夏時間から/への切り替え時に、真夜中に間違った日に実行すると、現在の時刻から 24*60*60 秒を減算して、同じ日または 2 日前になる可能性があることに注意してください。

cこれらのディレクトリの累積ディスク使用量を取得するには、rm -rfを に置き換えますdu -c。これらを削除した後に回収されるスペースの量がそれであるかどうかは、これらのディレクトリ内のファイルに他の場所へのハードリンクがあるかどうかによって決まります。

関連情報