Rsync e mv arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios

1. Rsync e mv arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios

robson fagundes
robsonfagundes

(usa Ubuntu)

Enviado em 01/05/2016 - 17:02h

Meus caros, estou tentando fazer um rsync e mv para sincronizar e aramazenar arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios e tudo isso diariamente. Vou explicar a minha situação...
Eu tenho um diretório raiz chamado:
/Frutas/2016/5/1/ 
e dentro dele tenho os subdiretórios "tipo de frutas":
Frutas/2016/5/1/banana 
Frutas/2016/5/1/laranja
Frutas/2016/5/1/maça
e dentro de cada subdiretórios "tipo de frutas" eu tenho outros subdiretórios "estado" com seus arquivos, no caso:
Frutas/2016/5/1/banana/verde/verde.txt
Frutas/2016/5/1/banana/madura/madura.txt
Frutas/2016/5/1/banana/podre/podre.txt

O que eu preciso, é no que durante o rsync ou até mesmo após com mv... armazenar os arquivos
verde.txt, madura.txt, podre.txt 
da seguinte forma:
Frutas/2016/5/1/banana/verde.txt
Frutas/2016/5/1/banana/madura.txt
Frutas/2016/5/1/banana/podre.txt

Mas existe um porém... eu não sei qual será o "tipo de fruta" e nem qual dela "estado" no diretório "Frutas" no dia "2016/5/1"...
Eu tentei fazer o seguinte:

#!/bin/bash
_year="$(date +'%Y')"
_month="$(date +'%-m')"
_day="$(date +'%-d')"
sudo rsync -Cravz /media/server-frutas/Frutas/${_year}"/"${_month}"/"${_day}"/" /home/Frutas/
sudo find /home/Frutas/ -name \*.txt -exec mv -ufv {} /home/Frutas/ \;
mas o máximo que consegui foi trazer todas os txt para /Frutas.
Alguém poderia me dar uma ajuda gostaria de fazer isso com Rsync direto sem a necessidade do mv...
Obrigado


  


2. Re: Rsync e mv arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 01/05/2016 - 18:07h

É possível eliminar os diretórios que representam "estado" na origem (/home/Frutas/)?



3. Re: Rsync e mv arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios

robson fagundes
robsonfagundes

(usa Ubuntu)

Enviado em 01/05/2016 - 20:21h

robsonfagundes escreveu:

textmode escreveu:

É possível eliminar os diretórios que representam "estado" na origem (/home/Frutas/)?

... O diretório de origem /media/server-frutas/ não posso!
Somente o de destino /home/Frutas/ eu posso manipular.





4. Re: Rsync e mv arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 01/05/2016 - 23:52h

Discuto duas (de muitas) possíveis soluções:

1. Pegar arquivo por arquivo pelo find, remover o diretório "estado" e recriar a árvore resultante no destino:


source='/media/server-frutas'
destination='/home/Frutas'
while IFS=$'\n' read src_path; do
dst_path=${src_path/$source/$destination}
dst_path=${dst_path%/*/*}
dst_path="${dst_path}/${src_path##*/}"
echo /usr/bin/install $src_path -D $dst_path
done < <(/usr/bin/find $source -type f)


Este código irá apenas imprimir o comandos. Se tiver certeza do resultado, remova o comando 'echo'.

2. Fazer rsync indiscriminadamente e modificar a árvore final. Exemplo:


/usr/bin/rsync -ACrvz $source/ $destination
while IFS=$'\n' read src_path; do
dst_path=${src_path%/*/*}
dst_path="${dst_path}/${src_path##*/}"
echo /usr/bin/mv $src_path $dst_path
echo /usr/bin/rmdir ${src_path%/*}
done < <(/usr/bin/find $destination -iregex '.*/\([^/]+\)/\1\.txt$')


Como na solução anterior, precisa remover o comando 'echo' aqui também.

O problema é que se um rsync "desavisado" pode estragar tudo.


São duas soluções simples e razoavelmente seguras, entretanto, você deve avaliar se há necessidade de incluir mais validações.




5. Re: Rsync e mv arquivos do subdiretório para diretorio raíz sem saber os nomes dos subdiretórios

robson fagundes
robsonfagundes

(usa Ubuntu)

Enviado em 02/05/2016 - 09:37h

textmode escreveu:

Discuto duas (de muitas) possíveis soluções:

1. Pegar arquivo por arquivo pelo find, remover o diretório "estado" e recriar a árvore resultante no destino:


Optei pela primeira solução e funcionou perfeitamente!
Valeu pela ajuda textmode, Obrigado !!!



6. Sync somente os diretórios e arquivos inexistentes

robson fagundes
robsonfagundes

(usa Ubuntu)

Enviado em 22/07/2016 - 10:35h

Meus caros,

Preciso add agora um sync somente com os diretórios e arquivos inexistentes
tentei colocar um -D porém não obtive resultado. Lembrando que optei pelo 1º exemplo
apresentado pelo textmode.

/usr/bin/install $src_path -DC $dst_path 


Alguém porderia me dar uma sugestão.
Att.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts