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

A find выражение является в основном списком предикатов (булевы условия). Почти во всех булевых контекстах, включая find выражения, AND оператор имеет приоритет OR. Если я добавляю некоторые круглые скобки, чтобы проиллюстрировать, что приоритет управляет явно, Ваша секунда find выражение логически эквивалентно

( -name .project ) OR ( -name .classpath AND -exec echo)

Для получения желаемого поведения Вам нужно

find mydir -maxdepth 2 \( -name .project -o -name .classpath \) -exec ... {} \;
3
31.12.2013, 01:00
3 ответа

Если Вы используете GNU date, можно использовать в своих интересах, это - способности к управлению датой:

#!/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 f d; 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 f d; do [ "$(date -d "$d" +%s)" -lt "$lim" ] && echo rm "$f";   done

ПРОТЕСТЫ: Это решение предполагает, что Ваши имена файлов не содержат пробелов и что самая длинная строка цифр в имени файла всегда будет датой.

0
27.01.2020, 21:44

Можно использовать сценарий после. Звоните с именами файлов, чтобы протестировать и удалить как аргументы.

#!/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)
2
27.01.2020, 21:44
  • 1
    за Ваш ответ. Поскольку у меня есть x86_64, я выполняю это, но я получил эту ошибку: [root@cousinot ~]# rpm -Uvh https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/17/Fedora/x86_64/os/Packages/f/fedora-release-17-1.noarch.rpm Retrieving https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/17/Fedora/x86_64/os/Packages/f/fedora-release-17-1.noarch.rpm Preparing... ########################################### [100%] package fedora-release-17-2.noarch (which is newer than fedora-release-17-1.noarch) is already installed ---------121--------160289----time.strptime мог бы хорошо сделать это легче. –  offby1 08.05.2015, 02:05
find . -type f -mtime +60 -exec rm -f {} \;

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

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

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

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

-2
27.01.2020, 21:44
  • 1
    , который я буду совет, для НЕ использования -f отметьте при удалении поискового вывода. Можно использовать -i флаг для просьбы в интерактивном режиме удаление comfirmation –  SHW 30.12.2013, 10:49
  • 2
    , первый код удаляет файлы на основе даты модификации, которая является точно не, что OP попросила проподсказки по –  Zelda 30.12.2013, 10:52

Теги

Похожие вопросы