Localizando arquivos duplicados e movendo UMA cópia para outra unidade, excluindo todas as outras cópias

1

Na verdade, estou tentando fazer duas coisas diferentes ...

Em primeiro lugar, é fazer uma cópia (no meu HDD de viagem) de todos os arquivos de vídeo, fotos e documentos, excluindo quaisquer duplicatas. Portanto, há apenas uma cópia no meu disco rígido de viagem. Isso teria que ser capaz de ver em muitos níveis de pastas (sistema de arquivos ntfs). A segunda coisa é transferir uma cópia de todos esses arquivos, excluindo da origem quaisquer duplicatas, deixando um original na origem e a cópia na unidade de viagem. Isto é para dois sistemas diferentes, é por isso que os dois pedidos semelhantes

Eu gostaria de poder limitá-lo a qualquer tipo de arquivo em particular (por codificação de comparação ou por extensão .xyz), bem como certificar-se de que os arquivos sejam checados quanto à duplicação.

Minhas necessidades combinam a função de localização de arquivos duplicados com a transferência / cópia automatizada em outra mídia ... de preferência em uma única etapa.

Existe tal ferramenta lá fora? ou como eu usaria a linha de comando para fazer isso?

    
por Marc 17.11.2018 / 09:36

1 resposta

1

Uma ideia seria usar uma combinação de fdupes e rsync .

  1. Crie a área de teste de todos os arquivos considerados para a transferência usando rsync .
  2. Exclua todas as duplicatas, exceto uma na área de preparação (apenas).
  3. Transfira os arquivos restantes no armazenamento temporário para o destino, novamente usando rsync .

Para fazer isso, precisamos de três locais:

  1. Originais, um caminho de diretório em $origdir .
  2. Área de preparação, um caminho de diretório em $stagingdir .
  3. Destino, um caminho local ou remoto em $destdir .

Primeiro, crie a área de preparo (isso pressupõe que a área de preparo ainda não existe ou, se existir, contém apenas coisas que devem ser transferidas):

rsync --archive --verbose --link-dest="$origdir" \
    --include="*.jpg" --include="*/" --exclude="*" \
    "$origdir/" "$stagingdir"

Isso copia todos os arquivos cujos nomes terminam em .jpg para a área de preparação por meio da criação de links físicos a partir de seus locais originais. Somente o espaço para criar a estrutura de diretórios seria necessário e os dados do arquivo não seriam duplicados (a menos que $stagingdir e $origdir estivessem localizados em duas partições diferentes). Para adicionar outros padrões de nome de arquivo, adicione mais opções --include ( antes a --exclude ).

Em seguida, execute fdupes over $stagingdir :

fdupes --delete --recurse "$stagingdir"

Isso interativamente solicitará sua confirmação antes de remover qualquer coisa. Há também uma opção --noprompt que removeria os arquivos sem confirmação. Por favor, leia o fdupes manual cuidadosamente . Os arquivos em $origdir não seriam afetados pela exclusão de arquivos da área de preparação,

Em seguida, exclua diretórios vazios do diretório temporário (este é um passo de bônus que apenas limpa um pouco as coisas):

find "$stagingdir" -type d -empty -delete -print

Isso passaria por toda a área de preparação e excluiria qualquer diretório vazio. Qualquer diretório excluído seria impresso após a exclusão bem-sucedida.

E, finalmente, transfira as não-duplicatas:

rsync --archive --verbose "$stagingdir/" "$destdir"

Esse processo manteria a estrutura de diretórios original para os arquivos que correspondem aos padrões usados no primeiro rsync e que ainda são mantidos após o fdupes remover os duplicados.

    
por 17.11.2018 / 10:07