Como podemos fazer o rsync incluir arquivos de nível superior?

0

Eu quero incluir todos os arquivos de nível superior ( file1.txt , file2 ) e somente qualquer coisa abaixo de /top/dir1/ . Como posso conseguir isso?

Eu tentei o seguinte, mas eles não funcionam

$ tree
.
└── from
    ├── file1.txt
    ├── file2
    └── top
        ├── dir1
        │   └── file3.txt
        └── dir2
            └── file4.txt

uma tentativa, falta de arquivos de nível superior

$ rsync --dry-run \
>       --include='top/' \
>       --include='top/dir1/' \
>       --include='top/dir1/***' \
>       --exclude='top/*' \
>       --exclude="*" \
>       -av from/* .
building file list ... done
top/
top/dir1/
top/dir1/file3.txt

outra tentativa de incluir arquivos de nível superior, mas não exclui dir2

$ rsync --dry-run \
>       --include="*" \
>       --include='top/' \
>       --include='top/dir1/' \
>       --include='top/dir1/***' \
>       --exclude='top/*' \
>       --exclude="*" \
>       -av from/* .
building file list ... done
file1.txt
file2
top/
top/dir1/
top/dir1/file3.txt
top/dir2/
top/dir2/file4.txt
    
por Stephane 05.01.2017 / 04:32

2 respostas

0

Se você não se importar em usar outro comando para fazer a filtragem, você pode usar alguns comandos GNU find :

(cd from; find . -mindepth 1 -type f -print0; find ./top/dir1 -print0;) |
  rsync -av --from0 --files-from=- from/ to

Em man rsync :

    --files-from=FILE       read list of source-file names from FILE
-0, --from0                 all *from/filter files are delimited by 0s

rsync pode aceitar uma lista de arquivos para sincronizar de outro arquivo (ou entrada padrão - ), mas os caminhos devem ser relativos (ou devemos usar --no-R para permitir caminhos absolutos). Portanto, primeiro cd para o diretório de origem, execute find com as opções apropriadas:

  • -mindepth 1 para restringir somente aos diretórios especificados, sem recursionar para subdiretórios
  • -type f para listar apenas arquivos regulares
  • -print0 para delimitar a saída usando caracteres ASCII NUL ( %code% )
por 05.01.2017 / 07:22
0

Você pode usar o seguinte para incluir TUDO no nível superior e somente dir1 no topo.

rsync --dry-run \                                      
   --include='top/dir1/***' \
   --exclude='top/*' \
   -av from/ .
    
por 23.09.2017 / 12:41

Tags