Как переместить файлы по году

Как переместить файлы по году

Мне нужно переместить файлы по году. Я использовал 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

Связанный контент