A find
выражение является в основном списком предикатов (булевы условия). Почти во всех булевых контекстах, включая find
выражения, AND
оператор имеет приоритет OR
. Если я добавляю некоторые круглые скобки, чтобы проиллюстрировать, что приоритет управляет явно, Ваша секунда find
выражение логически эквивалентно
( -name .project ) OR ( -name .classpath AND -exec echo)
Для получения желаемого поведения Вам нужно
find mydir -maxdepth 2 \( -name .project -o -name .classpath \) -exec ... {} \;
Если Вы используете 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
Можно использовать сценарий после. Звоните с именами файлов, чтобы протестировать и удалить как аргументы.
#!/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)
[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, например.
-f
отметьте при удалении поискового вывода. Можно использовать -i
флаг для просьбы в интерактивном режиме удаление comfirmation
– SHW
30.12.2013, 10:49