Como mover os arquivos com base no ano

Como mover os arquivos com base no ano

Preciso mover arquivos com base em um ano. Eu usei o findcomando

find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6

mas para que este comando seja executado com sucesso, preciso saber exatamente mtimeagora 470 é apenas um palpite. Significa que se eu puder fornecer o ano de 2012, isso me dará apenas arquivos relacionados a 2012.

Então eu preciso de conselhos sobre como

Encontre arquivos com base no ano, por exemplo, 2012 e mova-os para outro diretório.

OS release 5.2

FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 

Responder1

Você deseja usar a -newermtopção para find:

find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101

para obter todos os arquivos com data de modificação em 2012.

Se a sua descoberta não for compatível, -newermtvocê também pode fazer o seguinte para evitar o uso de cálculos de deslocamento:

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

Página de manual

-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

Responder2

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 lsnão faz nenhum sentido.

Responder3

De acordo com a página de manual, o argumento para -mtime é o número de dias que você está procurando. Você pode usar date +%jpara encontrar o número de dias desde 1º de janeiro do ano atual.

Responder4

Se você fizer isso no diretório de trabalho, poderá fazer o seguinte:

ls -l |awk '{ if ($8 == "2013") print $9 }'

Isso simplifica consideravelmente as coisas e não causa nenhuma sobreposição. Mas também pressupõe que esses arquivos tenham mais de 6 meses e que lsimprimirão o ano em vez da hora exata.

Para arquivos com mais de 6 meses, você apenas terá que substituí-los por isto:

ls -l |awk '{ if ($6 == "May") print $9 }' 

ou algo semelhante, dependendo do mês. Se você deseja criar uma lista de meses para mover arquivos (ou se deseja criar uma lista de anos), faça o seguinte:

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

informação relacionada