RSYNC não exclui diretórios de origem

25

Estou usando o rsync para extrair arquivos essenciais de um servidor e, em seguida, excluir os arquivos do servidor assim que os tiver localmente. O comando completo que estou executando está abaixo.

Isso exclui com êxito os arquivos no servidor de origem, embora ainda existam diretórios vazios. Não recebo mensagens ou erros. Toda saída é normal. Talvez esta seja a funcionalidade pretendida.

Como posso dizer ao rsync para limpar tudo, incluindo os diretórios?

rsync --progress -vrzh --remove-source-files

A versão é 3.0.9 em ambas as extremidades.

    
por Sajan Parikh 16.11.2013 / 09:06

5 respostas

12

O comportamento de --remove-source-files que você observa é exatamente o especificado por man rsync :

--remove-source-files

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

Não há um comando específico para remover os diretórios, pois essas duas discussões em StackExchange e ServerFault mostram claramente. A solução sugerida é a emissão de dois comandos separados:

 rsync -av --ignore-existing --remove-source-files source/ destination/ && \
 rsync -av --delete 'mktemp -d'/ source/ 

A última parte do comando sugerido nestes dois posts,

 rmdir source/

que é necessário para remover o diretório de origem (agora esvaziado) tem este formulário nesses posts porque os OPs e as respostas estão usando o rsync para mover grandes quantidades de arquivos dentro da mesma máquina. No seu caso, você terá que fazer isso manualmente.

    
por 16.11.2013 / 10:21
24

A manpage até diz:

--remove-source-files   sender removes synchronized files (non-dirs)

Se você quiser remover diretórios vazios em sua origem, se ainda houver arquivos, faça um:

find . -depth -type d -empty -delete

Mas, para um diretório raiz vazio, um rm -rf <directory> é suficiente.

    
por 16.11.2013 / 10:22
4

Usar " rm -rf " possui uma condição de corrida inerente, você pode excluir arquivos que acabaram de ser criados entre o rsync e o rm invocações.

Eu prefiro usar:

rsync --remove-source-files -a server:incoming/ incoming/ &&

ssh server find incoming -type d -delete

Isto NÃO removerá os diretórios se eles não estiverem vazios.

    
por 24.03.2015 / 17:38
0

-m, --prune-empty-dirs remove cadeias de diretórios vazias da lista de arquivos

--force forçar a exclusão de dirs mesmo que não esteja vazia

    
por 30.08.2016 / 11:12
0

Remova os arquivos de origem e remova os diretórios para segurança.

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

More on GNU Parallel

    
por 14.03.2017 / 11:41

Tags