Como copiar / unir dois diretórios e se dois arquivos tiverem o mesmo nome, renomeie o antigo, acrescentando sua hora de modificação.

3

Eu tenho vários diretórios com arquivos que geralmente têm o mesmo nome, mas podem ser diferentes e eu preciso que todos esses diretórios sejam mesclados em um novo. Eu preciso ser capaz de comparar os mesmos arquivos nomeados e se o mesmo ignorar / substituir ou se diferente mover / renomear o mais antigo, acrescentando a data / hora de modificação para o nome do arquivo.

Para adicionar mais detalhes e endereçar @Serhat Cevikel e @Wildcard: Os dados são armazenados em duas unidades com estrutura semelhante e, de certa forma, são complicadas, pois existem subpastas que precisam ser levadas em consideração. Aqui está uma árvore do ambiente de teste que criei e alguns comentários:

/bmrlbackup/drive1/
'-- user001
    '-- directory1
        '-- project001
            |-- file000           #identical
            |-- file001           #older same name
            |-- file0011          #unique
            |-- phase1
            |   |-- file000       #identical
            |   |-- file110       #unique
            |   |-- file999       #newer same name
            |   '-- phase11
            |       '-- file111   #unique
            '-- phase2
                '-- file120       #unique
/bmrlbackup/drive2/
'-- user002
    '-- directory2
        '-- project001
            |-- file000           #identical
            |-- file001           #newer same name
            |-- file0012          #unique
            |-- phase1
            |   |-- file000       #identical
            |   |-- file210       #unique
            |   '-- file999       #older same name
            '-- phase2
                |-- file220       #unique
                '-- phase21
                    '-- file221   #unique

A saída para o primeiro rsync:

#rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
project001/
project001/file0011
project001/phase1/
project001/phase1/file110
project001/phase1/phase11/
project001/phase1/phase11/file111
project001/phase2/
project001/phase2/file120

Alterou o remm (arquivos "mesmos" restantes) para listar os subdiretórios também:

#remm='ls -1 $(find $sd1/ -type f)'
/bmrlbackup/drive1/user001/directory1/project001/file000
/bmrlbackup/drive1/user001/directory1/project001/file001
/bmrlbackup/drive1/user001/directory1/project001/phase1/file000
/bmrlbackup/drive1/user001/directory1/project001/phase1/file999

Aqui, os dois arquivos:

/bmrlbackup/drive1/user001/directory1/project001/file000 
/bmrlbackup/drive1/user001/directory1/project001/phase1/file000

são os mesmos em ambos os locais e não precisam ser copiados ou podem ser movidos e sobrescrever o destino.

O mesmo nome é diferente dos arquivos de conteúdo:

/bmrlbackup/drive1/user001/directory1/project001/file001
/bmrlbackup/drive1/user001/directory1/project001/phase1/file999

Os arquivos de "mesmo nome de conteúdo diferente" precisam ser comparados e o mais antigo precisa ser renomeado: anexado com a data e hora de modificação, portanto, se a origem for mais recente, acrescente o nome do arquivo de destino e mova a origem. se a origem for mais antiga, anexe o nome da origem e mova o nome da fonte anexada.

O resultante deste processo acabará por mover todos os arquivos da unidade1 para a unidade2.

Em seguida, todos os erros para o mais antigo = 'encontrar {$ sd1, $ dd1} ....

Conselhos?

Não há mais de 10000 arquivos em cada unidade com tamanhos de 4k a 800M.

    
por fpt 14.12.2016 / 21:27

1 resposta

-1

Se eu não estiver errado, você quer dizer, quando os nomes de arquivos são diferentes no arquivo mv, quando os nomes dos arquivos são os mesmos, renomeie o antigo anexando a data / hora da modificação e, em seguida, mv. Aqui vai o script: Primeiro argumento é o caminho de origem, segundo argumento é o caminho de destino. Você não deve adicionar uma barra ao final dos caminhos:

(Atualização: "ls" é substituído por "find", para dois propósitos: não analisar ls e classificar arquivos de vários caminhos por data. A subestição variável é feita de forma mais concisa, conforme o próprio Wildcard e os dois espaços em branco e " : "são substituídos por espaços em branco)

#!/bin/bash

sd1=$1
dd1=$2


rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
remm='ls $sd1'

for i in $remm
do
    oldest='find {$sd1,$dd1} -type f -name $i -printf "%T@ %p\n" | sort -n | head -1 | cut -d " " -f2'
    appendd='stat $oldest --printf=%y\n | sed 's/ +.*//g' | sed 's/[ :]/_/g''
    newname="${oldest}_$appendd"
    mv $oldest $newname
done

rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
    
por 14.12.2016 / 22:03