Usando o Rsync em conjunto com o Find

1

Estou tentando escrever um script que copie arquivos criados nas últimas 24 horas e seja de um tipo de arquivo específico (* .png).

O comando que tentei é:

rsync -avz --ignore-existing --include='*.png' --exclude='*' \
 --files-from=<(ssh user@remote1 'find /home/admin/Backup/ -mtime -1 -type f -exec basename {} \;') \
  user@remote1:/home/admin/Backup/ /Repository/

Isso funciona para arquivos * .png no diretório Backup, no entanto, o comando falha quando os arquivos têm duas ou três pastas, ou seja, localizados em /home/admin/Backup/folder1/folder2/ O erro que recebo é

link_stat '/home/admin/Backup/example.png' failed: No such file or directory (2)

Isso ocorre porque basename {} está cortando o local quando retorna o resultado para rsync . Então eu tentei remover basename {} e eu entendi:

link_stat '/home/admin/Backup/home/admin/Backup/folder1/folder2/example.png' failed: No such file or directory (2)

É como rsync está anexando o diretório de origem e não sei como consertá-lo. Alguém sabe como consertar isso ou talvez eu esteja apenas fazendo esse arquivo sair do servidor remoto da maneira errada?

    
por Sam 23.01.2015 / 23:10

1 resposta

3

man rsync diz sobre --files-from :

  The  filenames  that  are read from the FILE are all relative to
  the source dir -- any leading slashes are removed  and  no  ".."
  references  are  allowed  to go higher than the source dir.  

Então, tente criar os caminhos em find relative:

rsync -avz ... --files-from=<(ssh user@remote1 'cd /home/admin/Backup/; find . -mtime -1 -type f -name "*.png")

Ou find /home/... ... -printf "%P\n" , pois %P em GNU find é:

File's name with the name of the command line argument under which it was found removed.

Tomei a liberdade de adicionar -name "*.png" , pois não vejo porque rsync deve fazer a filtragem quando find é capaz disso e já está sendo usado.

    
por 23.01.2015 / 23:28

Tags