Как удалить 2 месяца назад файлы в unix

Скажем, у меня ниже файлов журнала,

AA_XX_20130719185428.log exec_xxx_cpb_20130712182453.log 13122013121327_AR_INC_DOBC_1.dprf.log 24122013_masterscript.LOG 

Дата содержит как дату, так и время.

Я хочу удалить все 2 месяца назад файлы.

Я не хочу удалять файл на основе последней измененной даты, но на основе даты, указанной в имени файла. Даты могут быть в любом из следующих форматов:

  • ГГГГММДДччммсс
  • ddmmYYYYHHMMSS
  • DDMMYYYY.

Как я могу удалить файлы с помощью сценария оболочки?

3 Solutions collect form web for “Как удалить 2 месяца назад файлы в unix”

Вы можете использовать следующий скрипт. Вызовите имена файлов для проверки и удаления в качестве аргументов.

 #!/usr/bin/env python # encoding: utf-8 import os import sys import datetime test_file_names = [x for x in """\ AA_XX_20130719185428.log exec_xxx_cpb_20130712182453.log 13122013121327_AR_INC_DOBC_1.dprf.log 24122013_masterscript.LOG """.split('\n') if x.strip()] # appr. 2 meses two_months = datetime.date.today() - datetime.timedelta(days=61) testing = len(sys.argv) < 2 if testing: file_names = test_file_names else: file_names = sys.argv[1:] allow_datetime = set([ len('YYYYmmddHHMMSS'), len('ddmmYYYYHHMMSS'), len('ddmmYYYY'), ]) for file_name in test_file_names: for part in os.path.splitext(os.path.basename(file_name))[0].split('_'): if len(part) not in allow_datetime: continue for ch in part: if not ch.isdigit(): break else: dt = part if dt[4:6] == '20': # ddmmYYYY yy = int(dt[4:8]) mm = int(dt[2:4]) dd = int(dt[:2]) else: # YYYYmmdd yy = int(dt[:4]) mm = int(dt[4:6]) dd = int(dt[6:8]) try: d = datetime.date(yy, mm, dd) except ValueError: print 'wrong date', yy, mm, dd raise if testing: print '{:<6s} {:<40s} {}'.format( 'remove' if d < two_months else ' ', file_name, repr(d)) elif d < two_months: print 'removing', file_name os.remove(file_name) 

Если вы используете date GNU, вы можете воспользоваться ее способностями к дате:

 #!/usr/bin/env bash ## Define the age limit lim=$(date -d "2 months ago" +%s); ## Find all files in the current directory and ## sub directories find . -type f | ## Extract the longest string of numbers (we assume that is the date) ## and change mmdd to ddmm perl -lne ' ## skip file names that don't have enough numbers /(\d{1,8})/ || next; $d=$1; next unless $d; ## Change YYYYmmddHHMMSS to mm/dd/YYY if($d=~/201\d$/){$d=~s|(\d{2})(\d{2})(\d{4})|$2/$1/$3|} ## Change ddmmYYYYHHMMSS or ddmmYYYY to mm/dd/YYY else{$d=~s|(\d{4})(\d{2})(\d{2})|$2/$3/$1|}; ## Print the original file name and the modified date string print "$_ $d" if ' | ## Read the file name into $f and the date into $d while read fd; do ## If this date is older than $lim, delete the file if [ "$(date -d "$d" +%s)" -lt "$lim" ]; then rm "$f"; fi done 

Это можно сконденсировать в «однострочный», который вы можете скопировать / вставить прямо в терминал:

 lim=$(date -d "2 months ago" +%s); find . -type f | perl -lne ' /(\d{1,8})/ || next; $d=$1; if($d=~/201\d$/){$d=~s|(\d{2})(\d{2})(\d{4})|$2/$1/$3|} else{$d=~s|(\d{4})(\d{2})(\d{2})|$2/$3/$1|}; print "$_ $d"' | while read fd; do [ "$(date -d "$d" +%s)" -lt "$lim" ] && echo rm "$f"; done 

CAVEATS: это решение предполагает, что имена ваших файлов не содержат пробелов и что самая длинная строка цифр в имени файла всегда будет датой.

 find . -type f -mtime +60 -exec rm -f {} \; 

-mtime использует время, модифицированное файлом

 find . -type f -atime +60 -exec rm -f {} \; 

Время использования использует время доступа

также с ls -lc вы можете увидеть время создания inode. Это изменяется при обновлении данных inode, например, при использовании chmod, chown или chgrp.

  • Каталог Untar из большого tarball
  • grep инвертированное соответствие по строке, удовлетворяющей шаблону
  • запустить команду по скрипту в алфавитном порядке
  • Фильтровать дубликаты имен файлов с помощью tar
  • Получить список из 3 буквенных команд в Mac OS X
  • команда tar - пропустить символические ссылки
  • Чтение каталога в сценарии оболочки
  • Найти файл с расширением .csv в каталоге, соответствующем шаблону
  • Список файлов в иерархии каталога
  • Ограничение поддержки символов ZSH, поддерживающее повторение?
  • Как вы получаете первый файл в каждом подкаталоге, соответствующем списку расширений файлов?
  • Interesting Posts

    Ubuntu автоматически подключается к беспроводной сети, когда она уже подключена eth0 к той же сети

    Пользователь в группе не имеет группового доступа?

    Что лучше для веб-сервера уровня продукта: RHEL / Ubuntu Server / Debian / CentOS

    Разрешение конфликта между доменом подсети openvpn и доменом локальной подсети

    как я могу стереть сервер, к которому у меня нет физического доступа?

    Ошибка загрузки grub при загрузке, восстановление при ремонте не восстанавливается

    Я случайно удалил своего пользователя из нескольких групп, как узнать, какими они были?

    Опция ls -e недоступна в linux

    iptables –tcp-flags

    GNU parted resizeepart в скрипте

    Замените один блок текста на другой блок текста, когда заменяемый текст находится в файле

    Логротат не обрезающий открытый файл

    как добавить вывод в виде нового столбца с именами файлов

    Как узнать, какие пользователи находятся в группе в Linux?

    Как изменить шрифт GNOME 3.8 top bar?

    Linux и Unix - лучшая ОС в мире.