ディレクトリから5日以上古いファイルを削除するには、次のコマンドを使用できます。
find /directory -type f -mtime +5 -delete
しかし、私の場合は、名前に「YYYY-MM-DD」があり、5日後のファイルだけを削除したいと思います。
以下は、いくつかのファイル名の例です。
TEST_2016-11-20_14_02_52.log
server.log.2016-11-13
locsub.log.2016-12-04
wsgi.txt.2016-12-01
名前の形式が「ファイル」のみ年月日'と5日後のコンテンツは削除する必要があります。
正規表現を使用してfindコマンドでファイル名を照合する方法は?
答え1
GNUの使用find
:
find . -type f -mtime +5 \
-regextype egrep -regex '.*[0-9]{4}-[0-9]{2}-[0-9]{2}[^/]*$' \
-delete
正規表現は、形式に日付を含むパス名のデフォルト名のすべての文字列と一致しますYYYY-MM-DD
。XXYYYY-MM-DDZZ
whereXX
とZZ
isは他の文字と一致する可能性があります。
最後は、[^/]*$
式が現在のパス名の基本名と実際に一致することを確認し、「/
残りの文字列と一致しない」を意味します。
代わりにシェルワイルドカードパターンを使用してください(メンテナンスが簡単です)。
find . -type f -mtime +5 \
-name '*[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]*' \
-delete
これは-mtime +5
、期間が整数日数のファイルに対するものです。厳しく5日以上であれば6日以上です。 5日以上経過したファイルの場合-mtime +4
。
答え2
GNUツールを使用すると仮定すると、Babyyが言う偽の肯定を防ぐことができます。
find /directory -type f -mtime +5 -print | while read f; do
n=`basename "$f"`
d=`expr "X$n" : 'X.*\([0-9]\{4,\}-[0-9]\{2\}-[0-9]\{2,\}\)'` # (1)
test -n "$d" || continue # (2)
date -d "$d" >/dev/null 2>&1 && rm "$f" # (3)
done
コメント:
- (1)ファイル名の日付部分をに割り当てます
d
。これには先行番号と末尾番号が含まれます。日付部分がない場合は、空の文字列が割り当てられますd
。 - (2)
"$d"
空の文字列の場合は、次の繰り返しにジャンプします。これは予防するためのものです(サム)date -d
空の文字列を引数として渡すと成功しますので、ファイルを削除してください。 (これはGNUのバグのように見えますが、date
おそらくこの動作は意図的なようです。) - (サム)
"$d"
有効な日付が含まれている場合、ファイルは削除されます。日付の年のdate -d
部分が4桁を超える場合、月と日の部分が有効であれば操作は成功します。今それは真の未来保証型コード!