web-dev-qa-db-ja.com

N日より古い名前のYYYYMMDDを持つサブディレクトリを削除します

毎日のサブディレクトリが作成されるディレクトリがあり、文字通り_$date_に従って名前が付けられています。メタデータの日付ではなく、7日より古いフォルダとその内容を削除するにはどうすればよいですかファイル名のYYYYMMDDによる?私が持っていると言う(簡潔にするためにいくつかスキップした):

_20170817
20170823
20170828
20170901
_

私は次のフォルダになってしまいます(それらは保持する必要があります):

_20170828
20170901
_

7日前の日付を保持する変数を作成しました:dt_prev=$(date -d "`date`-7days" +%Y%m%d)

私の考えは、これらのフォルダ名のリストを_ls -l_して行ごとに比較することでしたが、これにはそのリストのクリーニングなどが含まれ、もっと簡単な方法が必要だと思います。

2
kstats9pt3

解決策は、 glenn jackmanが投稿したもの のより単純なバージョンになると思います。

seven_days=$(date -d "7 days ago" +%Y%m%d)
for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]; do
   [ -d "$f" ] || continue
   (( $f < $seven_days )) && echo rm -r "$f"
done

結果が正しいように見える場合は、echoを削除します。

-d testは、ディレクトリのみを検査(削除)することを確認します。

4
Jeff Schaller

parse ls ではなく、次のようなことができます。

for f in *; do test "$f" -lt "$date" && do something; done

あなたの例では、次のディレクトリとdate=20170825

$ ls
20170817  20170823  20170828  20170901
$ for f in *; do test "$f" -lt "$date" && echo "$f"; done
20170817
20170823
0
resc

findコマンドを使用するだけです。

find . -type d ! \( -name "$(date -d "-7 days" +%Y%m%d)" \
    $(eval printf "%s" "\" -o -name \
   \$(date -d -"{6..0}"days +%Y%m%d)\"") -o -name . \) -exec rm -rf -- '{}' +
  • のみd iretories-type d
  • 氏名が7日以上経過している取締役のみ。
  • そのディレクトリとその内容を削除しますrm -rf -- '{}'一度に+
0
αғsнιη

単一のfindコマンドの場合:

date_week_ago=$(date -d "7 days ago" +%Y%m%d)
find . -type d -regextype posix-extended -regex '.*/[0-9]{8}$' \
       -exec bash -c 'd=$(basename {}); (( '$date_week_ago' > $d )) && rm -rf "$d"' \;
0
RomanPerekhrest