rsync cria um diretório com o mesmo nome dentro da pasta de destino

3

Estou tentando rsync apenas arquivos .bin de pastas que começam com 11. * e 14. * (incluindo subpastas), com menos de 1 dia.

O que tentei até agora:

rsync -Rarv 'find /mnt/IP/ftp/123/ -type f -mtime -1' --prune-empty-dirs --include "1[1][4]./" --include="*.bin" --exclude="*" "/mnt/IP/ftp/123/" "/home/ftp/123/"

Geralmente funcionou, mas o Rsync criou um diretório com o mesmo nome dentro do destino: / home / ftp / 123 / mnt / IP / ftp / 123 /

Portanto, estou procurando uma solução para recriar apenas pastas que começam com 11. * ou 14. *

    
por Syn Romana 20.02.2017 / 17:46

2 respostas

0

Esta resposta não leva em consideração a restrição "não mais do que 1 dia".

Em vez de tentar analisar a saída de find , use rsync diretamente de find :

find /mnt/IP/ftp/123 -type -name '1[14].*' -prune \
    -exec rsync -av \
        --include='*.bin' --include='*/' \
        --exclude='*' --prune-empty-dirs {} /home/ftp/123 ';'

Isso localizaria os diretórios cujos nomes começam com 11. ou 14. em ou abaixo de /mnt/IP/ftp/123 . Para cada diretório, ele removeria o diretório da lista de pesquisa (com -prune ) e executaria

rsync -av --include='*.bin' --include='*/' \
    --exclude='*' --prune-empty-dirs {} /home/ftp/123 

onde {} seria substituído pelo nome do caminho do diretório encontrado.

O comando rsync criaria um subdiretório de /home/ftp/123 com o mesmo nome de arquivo do diretório encontrado (por exemplo, começando com 11. ou 14. ) e copiando os arquivos .bin .

Os padrões de inclusão e exclusão usados com rsync (a primeira partida vence):

  • --include='*.bin' : inclua qualquer arquivo cujo nome de arquivo termine com .bin .
  • --include='*/' : inclua qualquer diretório. Os diretórios vazios no destino serão removidos devido a --prune-empty-dirs .
  • --exclude='*' : exclua qualquer coisa não incluída nas regras anteriores.
por 22.06.2018 / 11:58
0

Você pode usar find para criar o conjunto de arquivos que satisfazem seus três critérios:

  • Não mais de um dia
  • Deve estar em diretórios correspondentes a 11.* ou 14.*
  • Arquivos correspondentes a *.bin

e, em seguida, alimente essa lista para rsync para processamento:

find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
    rsync -av --files-from - --from0 --prune-empty-dirs / dst/    

Eu usei -print0 e -from0 para garantir que os arquivos com caracteres inesperados em seus nomes sejam processados corretamente. O /./ extra no caminho find é para indicar a rsync que tudo antes desse componente deve ser retirado do caminho de destino. (Se você decidir usar um caminho relativo em find (ou seja, um que não comece com / ), altere a rsync source de / para . .

Cenário de exemplo

# All files in the example
find /mnt/IP/ftp/123/./ -type f
/mnt/IP/ftp/123/./11.one/7.skip/skip.bin
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./12.skip/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./item.bin
/mnt/IP/ftp/123/./sub/13.skip/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin
/mnt/IP/ftp/123/./sub/14.next/skip.this
/mnt/IP/ftp/123/./sub/item.bin

# Files matched by "find"
find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin

# Files copied by "rsync"
find /mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
    rsync -av --files-from - --from0 --prune-empty-dirs / dst/
building file list ... done
11.one/
11.one/item.bin
14.one/
14.one/item.bin
sub/
sub/14.next/
sub/14.next/item.bin
    
por 22.06.2018 / 13:31

Tags