
Мне нужно переместить файлы по году. Я использовал find
команду
find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6
но для успешного выполнения этой команды мне нужно знать точное mtime
время, 470 — это всего лишь предположение. Это значит, что если я могу указать год 2012, то он даст мне файлы, относящиеся только к 2012 году.
Поэтому мне нужен совет о том, как
Найдите файлы по году, например, 2012, и переместите их в другой каталог.
OS release 5.2
FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
решение1
Вы хотите использовать -newermt
опцию для find
:
find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101
чтобы получить все файлы с временем модификации в 2012 году.
Если ваш поиск не поддерживает эту функцию, -newermt
вы также можете сделать следующее, чтобы предотвратить использование вычислений смещения:
touch -d 20120101 /var/tmp/2012.ref
touch -d 20130101 /var/tmp/2013.ref
find /media/WD/backup/osool/olddata/ -newer /var/tmp/2012.ref -not -newer /var/tmp/2013.ref
Страница руководства
-newerXY reference
Compares the timestamp of the current file with reference. The
reference argument is normally the name of a file (and one of
its timestamps is used for the comparison) but it may also be a
string describing an absolute time. X and Y are placeholders
for other letters, and these letters select which time belonging
to how reference is used for the comparison.
...
m The modification time of the file reference
t reference is interpreted directly as a time
решение2
touch --date=2011-12-31T23:59:59 start
touch --date=2012-12-31T23:59:59 stop
find / -newer start \! -newer stop -printf %Tx" "%p\\n
-exec ls
не имеет никакого смысла.
решение3
Согласно странице man, аргумент -mtime — это количество дней, которое вы ищете. Вы можете использовать его, date +%j
чтобы найти количество дней с 1 января текущего года.
решение4
Если вы делаете это из рабочего каталога, то можно сделать так:
ls -l |awk '{ if ($8 == "2013") print $9 }'
Это значительно упрощает ситуацию и не приводит к перекрытиям. Но также предполагается, что эти файлы старше 6 месяцев, и это ls
напечатает год вместо точного времени.
Для файлов старше 6 месяцев вам просто придется заменить его на это:
ls -l |awk '{ if ($6 == "May") print $9 }'
или что-то подобное, в зависимости от месяца. Если вы хотите создать список месяцев для перемещения файлов (или если вы хотите создать список лет), сделайте следующее:
month="May Jun Jul";
for i in `echo $month`;
do
for j in `ls -l |awk '{ if ($6 == "'$i'") print $9}'`
do
mkdir -p $i
mv $j $i
done
done