Por que o rsync está copiando a estrutura do diretório quando o resultado da busca só mostra arquivos?

0

Eu tenho um comando find irritantemente complicado Eu montei um pipe para rsync com a intenção de copiar arquivos e sincronizar novas versões. Estou tentando escrever algo que seja eficiente o suficiente para ser executado em cron .

find /home/archive/dir1/ -not -path '*/\.*' -ipath "/home/archive/dir1/*/*document-name*" -type f \( -iname "*.ods" -o -iname "*.pdf" \) -print0 | rsync -v --delete --files-from=- --from0 / /home/user/newdir2/

A idéia é que ele vá para um diretório enorme, extraia os arquivos que possuem nomes de arquivos com document-name no caminho.

O problema é que ele não apenas copia arquivos, mas recursivamente copia toda a estrutura de diretório, quando eu simplesmente quero que todos os arquivos retornados de find sejam coletados neste diretório separado.

Eu obtenho exatamente o resultado que quero com:

find /home/archive/dir1/ -not -path '*/\.*' -ipath "/home/archive/dir1/*/*document-name*" -type f \( -iname "*.ods" -o -iname "*.pdf" \) -exec rsync -avz --delete {} /home/user/newdir2/ \;

O problema é que isso gera bilhões de rsync de instâncias para fazer algo que uma única lista de arquivos deveria fazer, provavelmente não é bom para cron .

IE, isso:

/home/archive/dir1/New1/New1 document-name.ods
/home/archive/dir1/New2/New2 document-name.pdf
/home/archive/dir1/New3/new3-DOCUMENT-NAME.ods
...
/home/archive/dir1/New9234/New9234-document-name.ods

Torna-se:

/home/user/newdir2/New1 document-name.ods
/home/user/newdir2/New2 document-name.pdf
/home/user/newdir2/new3-DOCUMENT-NAME.ods
...
/home/user/newdir2/New9234-document-name.ods

Todas as sugestões para melhorar meu comando são bem-vindas.

Eu tentei usar excluir no rsync, mas eu não acho que é a solução certa

Como posso eficientemente sincronizar todos esses arquivos?

    
por ezgoodnight 11.02.2016 / 23:37

1 resposta

1

Eu não acho que haja uma maneira muito mais eficiente de encontrar arquivos e executar uma única instância do rsync. Qualquer tentativa de enviar uma lista de arquivos para o rsync resultará em uma estrutura de diretórios mantida.

Uma alternativa (se você puder restringir o padrão de localização) é usar:

rsync -d --delete --include=*.pdf --include=*.ods --exclude=* /home/ms/archive/dir1/**/. /home/ms/newdir2/.

Isso sincronizará todos os arquivos pdf / ods de (sub) diretórios com a pasta / home / ms / newdir2 / sem manter os diretórios em uma única estrutura rsync.

O seu exemplo dado (no caso do nome do documento ou DOCUMENT-NAME) seria resolvido usando:

rsync -d --delete --include=*document-name.pdf --include=*DOCUMENT-NAME.pdf --include=*DOCUMENT-NAME.ods --include=*document-name.ods --include=*DOCUMENT-NAME.pdf --exclude=* /home/ms/archive/dir1/**/. /home/ms/newdir2/.
    
por Marcus 12.02.2016 / 14:40