Deseja compactar arquivos com base na data modificada

1

Um arquivo ( Paths.dat ) que contém vários Caminhos onde ele precisa encontrar arquivos com 15 dias e zip-lo na mesma pasta com data de modificação.

Paths.dat : - contém vários caminhos no sistema de arquivos (com delimitador '|')

/docusr1/user01 | /docusr2/user02 | /home/user01

ex: - / docusr1 / user01

-rwxrwxrwx. 1 docusr2 docusr2     0 Mar 30 10:52 vinay.txt
-rw-rw-r--. 1 docusr2 docusr2     0 Mar 30 10:52 sathish.txt
-rw-rw-r--. 1 docusr2 docusr2   625 Apr  2 10:57 demo1.xml
-rw-rw-r--. 1 docusr2 docusr2  4430 Apr  2 11:09 sample.xml
-rw-rw-r--. 1 docusr2 docusr2    48 Apr  2 14:04 20180402140454.log
-rw-rw-r--. 1 docusr2 docusr2    48 Apr  2 14:39 20180402143917.log
-rw-rw-r--. 1 docusr2 docusr2    39 Apr  2 14:41 20180402144159.log
-rw-rw-r--. 1 docusr2 docusr2    84 Apr  2 14:46 20180402144651.log
-rw-rw-r--. 1 docusr2 docusr2   279 Apr  2 14:48 archive.sh
-rw-rw-r--. 1 docusr2 docusr2    84 Apr  2 14:48 20180402144814.log
-rw-rw-r--. 1 docusr2 docusr2  1228 Apr  5 10:10 real.xml

procure por arquivos que tenham 15 dias e precise compactar os arquivos com data modificada como nome do arquivo zip (archive)

o / p esperado: -

20170330.zip  -> it should contain all file which are modified on 2017-03-30
20170402.zip
20170405.zip
    
por Vinay Gowda 10.04.2018 / 08:50

2 respostas

0
find . -maxdepth 1 -mtime +15 -type f -printf "%TY%Tm%Td %p\n" | while read date name ; do zip $date $name; done

Hora da última modificação do arquivo no formato Ymd

Para fazer isso por todos os diretórios, existem diferentes maneiras de fazer isso, dando abaixo alguns, certifique-se de usar caminho absoluto com find, por exemplo, eu uso "/home/user"

find /home/user -type d -print0 | while read -d '' -r dir; do cd "$dir" && pwd && find . -maxdepth 1 -mtime +15 -type f -printf "%TY%Tm%Td %p\n" | while read date name ; do zip $date $name; done; done

ou

find /home/user -type d -print0 | xargs -0 -I {} sh -c 'cd '\"{}\"' && pwd && find . -maxdepth 1 -mtime +15 -type f -printf "%TY%Tm%Td %p\n" | while read date name ; do zip $date $name; done'
    
por 10.04.2018 / 12:43
1

Você pode tentar o seguinte:

while read zipfile files; do 
    zip ${zipfile}.zip $files
done <<< $(find -maxdepth 1 -type f | xargs stat -c "%y,%n" | awk -F, '{a[substr($1,1,10)]=a[substr($1,1,10)] " " $2} END{for(i in a){print i a[i]}}')

O loop while espera seqüências de caracteres com o seguinte formato:

zipfilename file1 file2 file3 ...

Isso é alcançado por

  • obtendo todos os arquivos regulares do diretório atual: find -maxdepth 1 -type f
  • olhando a hora da modificação usando stat
  • formatar o resultado usando awk , de forma que todos os arquivos modificados naquele dia sejam listados em uma linha
por 10.04.2018 / 10:49