![Encontrar e remover arquivos duplicados no osx com um script](https://rvso.com/image/1331466/Encontrar%20e%20remover%20arquivos%20duplicados%20no%20osx%20com%20um%20script.png)
De:http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ Como modifico isso para excluir apenas a primeira versão do arquivo que ele vê.
Abra o Terminal no Spotlight ou na pasta Utilities. Mude para o diretório (pasta) que deseja pesquisar (incluindo subpastas) usando o comando cd. No prompt de comando, digite cd, por exemplo, cd ~/Documents para alterar o diretório para sua pasta inicial de Documentos. No prompt de comando, digite o seguinte comando:
find . -size 20 \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif – /tmp/f.tmp > duplicates.txt
Este método usa uma soma de verificação simples para determinar se os arquivos são idênticos. Os nomes dos itens duplicados serão listados em um arquivo chamado duplicatas.txt no diretório atual. Abra para ver os nomes de arquivos idênticos. Agora existem várias maneiras de excluir as duplicatas. Para excluir todos os arquivos do arquivo de texto, no prompt de comando digite:
while read file; do rm "$file"; done < duplicates.txt
Responder1
Primeiramente, você terá que reordenar a primeira linha de comando para que a ordem dos arquivos encontrados pelo comando find seja mantida:
find . -size 20 ! -type d -exec cksum {} \; | tee /tmp/f.tmp | cut -f 1,2 -d ‘ ‘ | sort | uniq -d | grep -hif – /tmp/f.tmp > duplicates.txt
(Nota: para fins de teste na minha máquina eu usei find . -type f -exec cksum {} \;
)
Em segundo lugar, uma maneira de imprimir todas as duplicatas, exceto a primeira, é usando um arquivo auxiliar, digamos /tmp/f2.tmp
. Então poderíamos fazer algo como:
while read line; do
checksum=$(echo "$line" | cut -f 1,2 -d' ')
file=$(echo "$line" | cut -f 3 -d' ')
if grep "$checksum" /tmp/f2.tmp > /dev/null; then
# /tmp/f2.tmp already contains the checksum
# print the file name
# (printf is safer than echo, when for example "$file" starts with "-")
printf %s\\n "$file"
else
echo "$checksum" >> /tmp/f2.tmp
fi
done < duplicates.txt
Apenas certifique-se de que /tmp/f2.tmp
exista e esteja vazio antes de executar isso, por exemplo, por meio dos seguintes comandos:
rm /tmp/f2.tmp
touch /tmp/f2.tmp
Espero que isso ajude =)
Responder2
Outra opção é usar fdupes:
brew install fdupes
fdupes -r .
fdupes -r .
encontra arquivos duplicados recursivamente no diretório atual. Adicione -d
para excluir as duplicatas – você será questionado sobre quais arquivos manter; se você adicionar -dN
, o fdupes sempre manterá o primeiro arquivo e excluirá os outros arquivos.
Responder3
Eu escrevi um script que renomeia seus arquivos para corresponder a um hash de seu conteúdo.
Ele usa um subconjunto de bytes do arquivo, por isso é rápido e, se houver uma colisão, acrescenta um contador ao nome como este:
3101ace8db9f.jpg
3101ace8db9f (1).jpg
3101ace8db9f (2).jpg
Isso torna mais fácil revisar e excluir duplicatas por conta própria, sem confiar suas fotos no software de outra pessoa mais do que o necessário.
Roteiro: https://gist.github.com/SimplGy/75bb4fd26a12d4f16da6df1c4e506562
Responder4
Isso é feito com a ajuda do aplicativo EagleFiler, desenvolvido porMichael Tsai.
tell application "EagleFiler"
set _checksums to {}
set _recordsSeen to {}
set _records to selected records of browser window 1
set _trash to trash of document of browser window 1
repeat with _record in _records
set _checksum to _record's checksum
set _matches to my findMatch(_checksum, _checksums, _recordsSeen)
if _matches is {} then
set _checksums to {_checksum} & _checksums
set _recordsSeen to {_record} & _recordsSeen
else
set _otherRecord to item 1 of _matches
if _otherRecord's modification date > _record's modification date
then
set _record's container to _trash
else
set _otherRecord's container to _trash
set _checksums to {_checksum} & _checksums
set _recordsSeen to {_record} & _recordsSeen
end if
end if
end repeat
end tell
on findMatch(_checksum, _checksums, _recordsSeen)
tell application "EagleFiler"
if _checksum is "" then return {}
if _checksums contains _checksum then
repeat with i from 1 to length of _checksums
if item i of _checksums is _checksum then
return item i of _recordsSeen
end if
end repeat
end if
return {}
end tell
end findMatch
Você também pode excluir automaticamente duplicatas com o removedor de arquivos duplicados sugerido emesta postagem.