Recentemente, tenho a necessidade de excluir muitas duplicatas. Estou mesclando três ou quatro sistemas de arquivos e quero que o espaço seja usado economicamente. No começo, fdupes
parecia ser a melhor ferramenta para o trabalho, mas estou cada vez mais enfrentando limitações.
Considere o comando fdupes -rdN somedirectory/
. Isso cria um hash de todos os arquivos nos subdiretórios de um diretório.
E quando encontra duplicatas, as exclui, para que haja apenas uma cópia de tudo.
Mas e se eu quiser ficar com somedirectory/subdirectory1/somefile
, na verdade, quatro duplicatas, e o programa encontrar uma das duplicatas primeiro? Então ele apaga somedirectory/subdirectory1/somefile
, o que eu não quero.
Quero poder especificar, de alguma forma, quais duplicatas manter. E até agora, nenhum dos programas padrão para lidar com duplicatas (duff, FSLint) parece permitir a automação desse tipo de comportamento. Eu preferiria não fazer o meu próprio, é por isso que estou fazendo esta pergunta.
Eu gostaria de poder escrever algo como
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
fonte
Respostas:
Embora a funcionalidade que você procura não esteja disponível em estoque
fdupes
, eu peguei o garfofdupes
(meu garfo é chamadojdupes
) e adicionei alguns recursos que podem resolver esse problema em determinadas circunstâncias. Por exemplo, no caso declarado em que você deseja mantersomedirectory/subdirectory1/somefile
a exclusão automática de duplicatas (d
eN
alterna juntas) e não há arquivos separados imediatamente abaixosomedirectory
,jdupes
pode ser alimentado cada caminho de subdiretório imediato comsubdirectory1
first e a-O
opção (que classifica os arquivos por comando primeiro parâmetro da linha):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Isso excluirá automaticamente todos os arquivos, exceto um, em um conjunto duplicado, e garantirá que, se o conjunto contiver um arquivo,
somedirectory/subdirectory1
ele será o primeiro, tornando-se automaticamente o arquivo preservado no conjunto. Ainda existem limites evidentes para essa abordagem, como o fato de que outra duplicatasomedirectory/subdirectory1
pode ser preservada em vez da que você deseja manter, mas em um bom número de casos como o seu, ajdupes
opção de ordem de parâmetro como solução alternativa é boa o suficiente.Em um futuro próximo, pretendo adicionar um sistema de filtragem
jdupes
que permita uma enorme quantidade de controle sobre a inclusão / exclusão de arquivos, preservação de-N
ações e aplicação dessas "pilhas de filtros" em uma base global ou por parâmetro. Esse recurso é extremamente necessário; Eu imagino algo assim para "excluir automaticamente duplicatas diferentes de zero recursivamente, mas sempre preservarsomedirectory/subdirectory1/somefile
como está":jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
fonte
E quanto a vincular os arquivos duplicados juntos? Dessa forma, o espaço é usado apenas uma vez, mas eles ainda existem em todos os caminhos. O problema é que os arquivos com links físicos devem ser modificados no local (eles devem ser modificados apenas para excluir o arquivo e recriá-lo com o novo conteúdo). A outra abordagem é vincular os arquivos juntos, embora você tenha o mesmo problema de decidir qual é o arquivo "primário". Isso pode ser feito com o seguinte script (embora observe que isso não trata nomes de arquivos que contêm espaços).
fonte
jdupes
vez defdupes
você pode simplesmente ir, ojdupes -nrL somedirectory/
que é massivamente mais rápido.Eu não vi esse em nenhum outro lugar: diga o que você quer é isso. Você tem / mnt / folder-tree-1 / mnt / folder-tree-2. Você não deseja remover todos os duplicados, mas se houver um arquivo na árvore 2 e um arquivo idêntico na árvore 1 com o mesmo caminho e nome, remova-o da árvore 2.
Aviso: isso é bem conciso e se você tentar copiar e colar isso com habilidades limitadas de shell, tenha cuidado.
Ou tudo em uma linha:
Depois, inspecione e execute rm-v2-dupes.sh
fonte
Eu tive a mesma pergunta. Se você tiver muitas duplicatas,
fdupes /my/directory/ -rdN
manterá o arquivo com a data de modificação mais antiga ou se vários arquivos tiverem a mesma data de modificação, o que foi encontrado primeiro.Se a data de modificação não for importante para você, você pode
touch
os arquivos no diretório que deseja manter. Se você optar portouch
eles com a data e hora atuaisfdupes -rdNi
, manterá os com a data atual. Ou você podetouch
manter os arquivos com uma data anterior à daqueles que você deseja excluir e usarfdupes -rdN
normalmente.Se você precisar manter a data de modificação, precisará usar um dos outros métodos.
fonte
Apenas para adicionar um toque a uma resposta anterior. Eu usei o código a seguir várias vezes, modificando ligeiramente uma resposta anterior com um simples
| grep
para isolar a pasta da qual quero excluir.Novamente, isso criará um arquivo sh para excluir todos os arquivos listados, sem linhas comentadas. Claro que você ainda pode editar o arquivo para comentar linhas / arquivos específicos que deseja manter.
Outra dica para diretórios grandes é executar fdupes em um arquivo txt, depois experimentar
| grep
e| sed
até obter o resultado desejado.fonte
Use
sed
para criar um arquivo shell que conterá comandos comentados para excluir cada um de seus arquivos duplicados:O
remove-duplicate-files.sh
arquivo resultante que acabamos de criar terá cada linha comentada. Descomente os arquivos que você deseja excluir. Então corrash remove-duplicate-files.sh
. Voila!ATUALIZAR
Bem, se você não deseja excluir arquivos apenas em determinados diretórios, é simples assim :
Onde
exclude_duplicates.py
fica:O
remove-duplicate-files-keep-protected.sh
arquivo resultante que acabamos de criar terá todos os arquivos dos diretórios protegidos comentados. Abra este arquivo no seu editor de texto favorito, verifique se está tudo bem. Então execute. Voila (sic)!fonte
Que tal algo assim?
fonte