Eu tenho dois diretórios images e images2 com essa estrutura no Linux:
/images/ad
/images/fe
/images/foo
... e outras 4000 pastas
e o outro é como:
/images2/ad
/images2/fe
/images2/foo
... e outras 4000 pastas
Cada uma dessas pastas contém imagens e os nomes dos diretórios em imagens e imagens2 são exatamente os mesmos, porém seu conteúdo é diferente. Quero saber como posso mesclar as imagens de / images2 / ad em images / ad, as imagens de / images2 / foo em images / foo e assim por diante com todas as 4000 pastas.
Respostas:
Este é um trabalho para o rsync . Não há nenhum benefício em fazer isso manualmente com um loop de shell, a menos que você queira mover o arquivo em vez de copiá-lo.
No seu caso:
(Observe a barra à direita
images2
; caso contrário, ela copiaria para/images/images2
.)Se as imagens com o mesmo nome existir em ambos os diretórios, o comando acima irá substituir
/images/SOMEPATH/SOMEFILE
com/images2/SOMEPATH/SOMEFILE
. Se você deseja substituir arquivos somente mais velhos, adicione a opção-u
. Se você quiser manter sempre a versão em/images
, adicione a opção--ignore-existing
.Se você deseja mover os arquivos
/images2
, com rsync, você pode passar a opção--remove-source-files
. Em seguida, o rsync copia todos os arquivos e remove cada arquivo quando terminar. Isso é muito mais lento do que se mover se os diretórios de origem e destino estiverem no mesmo sistema de arquivos.fonte
rsync
, entãorm -r /images
.rsync -a images images2
, ele copiará images2 em imagens em vez de mesclá-las.A melhor opção, como já postada, é, obviamente, o rsync. No entanto, também o uníssono seria um ótimo software para fazer esse trabalho. Ambos podem ser usados em vários sistemas operacionais.
Rsync
O rsync sincroniza em uma direção da origem ao destino. Portanto, a seguinte declaração
sincroniza tudo, desde a origem até o destino . A pasta mesclada reside em Destino .
-a significa "arquivar" e copia tudo recursivamente da origem ao destino, preservando quase tudo.
-v fornece mais saída ("detalhado").
-h para legível por humanos.
- progrida para mostrar quanto trabalho é feito.
Se você deseja atualizar apenas a pasta de destino com arquivos mais recentes da pasta de origem:
Uníssono
uníssono sincroniza em ambas as direções. Portanto, a seguinte declaração
sincroniza os dois diretórios nas duas direções e, finalmente, a origem é igual ao destino. É como fazer o rsync duas vezes da fonte ao dest e vice-versa.
Para usos mais avançados, consulte as páginas de manual ou os seguintes sites:
fonte
rsync -avh --progress source/ destination/
, caso contrário, a pasta de origem será criada na pasta de destino, pelo menos no meu caso, dessa forma.Faça um loop sobre todo o conteúdo do
images2
uso de uma glob expandida (para evitar problemas de análisels
) e, em seguida,mv
o conteúdo desses itens na entrada correspondenteimages
. Usabasename
para remover a liderançaimages2
do caminho globbed.fonte
@ inulinux12, você pode usar o seguinte
for
loop de uma linha da linha de comando:Isso moverá todos os arquivos de
images2
paraimages
em seus respectivos diretórios. Nota: isso pressupõe que nenhum arquivo tenha o mesmo nome.Por exemplo:
Antes da execução:
Após a execução:
fonte
ls
. mywiki.wooledge.org/ParsingLsbasename
nessa situação específica (não é necessário pedirbasename
isso). Obrigado novamente por comentários construtivos.