Como mover os arquivos com base no ano

10

Eu preciso mover arquivos com base em um ano. Eu usei o comando find

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

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

Então eu preciso de conselhos sobre como

Find files based on year e.g 2012 and move them to other directory.

OS release 5.2

FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 
    
por OmiPenguin 22.04.2013 / 14:36

5 respostas

31

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

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

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

Se a sua descoberta não der suporte a -newermt , você também poderá fazer o seguinte para evitar o uso de cálculos de compensação:

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
    
por 22.04.2013 / 14:49
4
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 não faz sentido.

    
por 22.04.2013 / 14:58
3

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

    
por 22.04.2013 / 14:41
2

Você pode tentar usar uma combinação com os comandos stat e / ou date , como nos seguintes one-liners:

BSD / Mac OS X:

find . -type f -print | while read file; do eval 'stat -s "$file"'; year='date -jf "%s" "+%Y" "$st_mtime"'; dest="/path/to/destination/$year; mkdir -p "$dest"; mv "$file" "$dest"; done

Linux:

find . -type f -print | while read file; do year='date -r "$file" "+%Y"'; dest="/path/to/destination/$year; mkdir -p "$dest"; mv "$file" "$dest"; done

Em ambos os casos, a abordagem é usar o comando date para extrair o ano da hora da última modificação de cada arquivo e, em seguida, construir um caminho com este ano. O comando mkdir -p criará esse caminho se ele não existir. É claro que você pode usar algumas outras opções de find para refinar sua pesquisa.

    
por 23.04.2013 / 01:19
0

Se você fizer isso a partir do diretório de trabalho, poderá fazer isso:

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 ls imprima o ano em vez do horário exato.

Para arquivos com mais de 6 meses, você só precisará substituí-lo por:

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

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

month="May June July"; 
for i in 'echo $month'; 
do 
    for j in 'ls -l |awk '{ if ($8 == "'$i'") print $9}''
    do
        mv $j $dest;
    done
done
    
por 03.05.2016 / 19:28

Tags