Uma maneira mais rápida de renomear arquivos duplicados (identificados por fdupes) em outro diretório?

4

Eu tenho um diretório cheio de arquivos pdf de artigos de periódicos, a maioria dos quais são nomeados por sua chave bibtex. Algum tempo atrás eu fiz um backup em um disco rígido externo, mas não o mantive atualizado e há toneladas de duplicatas com nomes diferentes. Eu quero colocar os dois diretórios de volta em sincronia e excluir os arquivos extras.

Usando fdupes eu identifiquei um monte deles, e agora eu tenho uma boa lista de pares deles. No entanto, a maioria das duplicatas na unidade externa tem nomes sem sentido. Eu gostaria de renomeá-los para ser o mesmo que o duplicado no primeiro diretório, em vez de excluí-los e copiá-los novamente, porque há muitos deles. Então eu não quero apenas usar o rsync.

Por exemplo, se a saída do fdupes for:

/home/articles/bibtex.pdf
/external/articles/morearticles44.pdf

Existe uma maneira mais rápida do que escrever

mv /external/articles/morearticles44.pdf /external/articles/bibtex.pdf

para cada par de duplicatas?

    
por user3035900 09.04.2014 / 13:29

2 respostas

1

Na minha experiência, fdupes pode ser inconsistente na ordem em que ele gera os arquivos (tive meus próprios problemas usando a opção --delete ). Isso deve ser razoavelmente robusto, pois não requer que os arquivos estejam em uma ordem específica (desde que haja sempre dois dupes em pastas diferentes):

# note no trailing slash
source_dir=/home/articles
target_dir=/external/articles

fdupes "$target_dir" "$source_dir" |
  while IFS= read file; do
    case "$file" in
      "$source_dir/"*)
         source=${file##*/}
         ;;
      "$target_dir/"*)
         target=$file
         ;;
      '')
         if [ "$source" ] && [ "$target" ]; then
           echo mv -i "$target" "$target_dir/$source"
         fi
         unset source target
         ;;
    esac
  done

Isso apenas imprimirá os comandos mv , removerá o echo quando tiver certeza de que você tem o que deseja. Além disso, a opção -i para mv solicitará a você se vai sobrescrever qualquer coisa.

    
por 09.04.2014 / 14:40
1

Vou propor um fluxo de trabalho diferente ( sugerido por hasenj ): em vez de usar fdupes para identificar arquivos duplicados e executar algum pós-processamento para removê-los, você pode usar Unison para identificar e lidar com duplicatas.

Você precisa executar o Unison com uma das raízes remotas, caso contrário, ele não detectará arquivos idênticos. Então corra

unison /home/articles/bibtex.pdf ssh://localhost/external/articles

Unison vai agitar por um tempo e propor sincronizar as duas árvores. Escolha sincronizar na direção > para mover /external/articles/morearticles44.pdf para /external/articles/bibtex.pdf .

    
por 10.04.2014 / 03:32