Как удалить файлы в одной папке, которая старше 60 дней в UNIX?

Я знаю, как удалить файлы, возраст которых превышает 60 дней, по времени модификации, но я хочу удалить файлы на основе метки времени в имени файла.

Например, у меня есть файлы ниже для каждого дня ежемесячно, и у меня есть эти файлы за последние 3 года.

vtm_data_12month_20140301.txt vtm_data_12month_20140301.control vtm_mtd_20130622.txt vtm_mtd_20130622.control vtm_ytd_20131031.txt vtm_ytd_20131031.control 

Я бы хотел написать сценарий, чтобы найти все файлы старше 60 дней (на основе имени файла) и удалить их все, кроме последнего файла каждого месяца. Например, в январе я хочу удалить все, кроме vtm_data_12month_20140131.txt . Проблема здесь в том, что есть вероятность, что у меня могут быть файлы, полученные 30 января, поэтому в этом случае я не должен удалять последний файл, но я должен удалить остальные.

Пожалуйста, сообщите мне, как я могу это сделать с помощью сценария оболочки?

4 Solutions collect form web for “Как удалить файлы в одной папке, которая старше 60 дней в UNIX?”

Хорошо, я переделал этот скрипт, и, сортируя его назад, похоже, что он должен работать. Он сравнивает год и месяц с предыдущим, и если он ниже, он должен быть последней записью за этот месяц.

 #!/bin/bash #the tac reverses the listing, so we go from newest to oldest, vital for our logic below FILES=`ls | tac` #create a cutoff date by taking current date minus our 60 day limit CUTOFFDATE=`date --date="60 days ago" +%Y%m%d` #we are setting this value to month 13 of the current year LASTYEARMONTH=`date +%Y`13 for file in $FILES; do #get datestamp FILEDATE=`expr match "$file" '.*\(20[0-9][0-9][0-9][0-9][0-9][0-9]\)'` #get year and month, ie 201410 THISYEARMONTH=${FILEDATE:0:6} if [ ! -z $FILEDATE ] && [ $THISYEARMONTH -lt $LASTYEARMONTH ]; then echo "$file IS THE LAST FILE OF THE MONTH. NOT DELETING" else #now we see if the file is older than 60 days (ie, has a LOWER unix timestamp than our cutoff) if [ ! -z $FILEDATE ] && [ $FILEDATE -lt $CUTOFFDATE ]; then echo "$file has a file date of $FILEDATE which is older than 60 days." #uncomment this next line to remove #rm $file fi fi LASTYEARMONTH=$THISYEARMONTH done 

Следующий код не сохраняет последний файл каждого месяца.

 #! /bin/bash cmp_timestamp=$(date --date="60 days ago" +%Y%m%d) while read filename; do [[ $filename =~ _(20[0-9][0-9][01][0-9][0123][0-9])\. ]] timestamp=${BASH_REMATCH[1]} printf "%-40s : %s\n" "$filename" "${timestamp}" if [ "$timestamp" -lt "$cmp_timestamp" ]; then echo " delete this file" : rm "$filename" else echo " DO NOT delete this file" fi echo done <file 

От man bash :

 BASH_REMATCH An array variable whose members are assigned by the =~ binary operator to the [[ conditional command. The element with index 0 is the portion of the string matching the entire regular expression. The element with index n is the portion of the string matching the nth parenthesized subexpression. This variable is read-only. 

Вы можете попробовать это во время цикла:

 #!/bin/bash A=vtm_data_12month_20140301.txt B=`ls vtm_data_12month_20140301.txt | awk -F "_" '{print $4}' | awk -F "." '{print $1}'` C=`date --date="60 days ago" +%Y%m%d` if [ "$B" < "$C" ] then rm -fr $A else echo "$A is not older" fi 

Ниже скрипта python задание, дни, из которого должны быть удалены файлы, может быть настроено с переменной days .

 #!/usr/bin/env python3 import os import re import datetime days=60 delta = datetime.date.today() - datetime.timedelta(days=days) files = [ x for x in os.listdir() if re.search('_\d{8}\.', x)] for file in files: date = re.search('_(\d{8})\.', file).group(1) if datetime.datetime.strptime(date, '%Y%m%d').date() <= delta: print('Removing file: ',file) os.remove(file) 

Вывод:

 $ ./remove.py Removing file: vtm_data_12month_20140301.txt Removing file: vtm_mtd_20130622.control Removing file: vtm_data_12month_20140301.control Removing file: vtm_mtd_20130622.txt Removing file: vtm_ytd_20131031.txt Removing file: vtm_ytd_20131031.control 
  • Почему «touch -a» также устанавливает ctime?
  • Solaris + отметка времени файла отображения
  • Подробная информация о команде Stat
  • Найти изображения с одинаковой временной отметкой exif
  • Как я могу изменить дату, измененную для папки, на последний измененный файл внутри?
  • «Обновляет» zip-файл с опцией -FS изменяет время модификации файла?
  • Изменение времени изменения файла для доступа к времени в массовом порядке
  • Использует ли `git archive` неправильную временную метку файла?
  • Каково законное использование команды `touch`?
  • Bash: сортировка элементов массива по дате файла
  • Сохранять измененную метку времени после редактирования
  • Linux и Unix - лучшая ОС в мире.