
De:http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ ¿Cómo modifico esto para eliminar solo la primera versión del archivo que ve?
Abra Terminal desde Spotlight o la carpeta Utilidades Cambie al directorio (carpeta) desde el que desea buscar (incluidas las subcarpetas) usando el comando cd. En el símbolo del sistema, escriba cd, por ejemplo, cd ~/Documentos para cambiar el directorio a su carpeta principal de Documentos. En el símbolo del sistema, escriba el siguiente 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 utiliza una suma de verificación simple para determinar si los archivos son idénticos. Los nombres de los elementos duplicados aparecerán en un archivo llamado duplicados.txt en el directorio actual. Abra esto para ver los nombres de archivos idénticos. Ahora hay varias formas de eliminar los duplicados. Para eliminar todos los archivos del archivo de texto, en el símbolo del sistema escriba:
while read file; do rm "$file"; done < duplicates.txt
Respuesta1
En primer lugar, tendrá que reordenar la primera línea de comando para mantener el orden de los archivos encontrados por el comando de búsqueda:
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 fines de prueba en mi máquina utilicé find . -type f -exec cksum {} \;
)
En segundo lugar, una forma de imprimir todos los duplicados excepto el primero es mediante el uso de un archivo auxiliar, digamos /tmp/f2.tmp
. Entonces podríamos hacer 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
Solo asegúrese de que /tmp/f2.tmp
exista y esté vacío antes de ejecutarlo, por ejemplo, mediante los siguientes comandos:
rm /tmp/f2.tmp
touch /tmp/f2.tmp
Espero que esto ayude =)
Respuesta2
Otra opción es utilizar fdupes:
brew install fdupes
fdupes -r .
fdupes -r .
busca archivos duplicados de forma recursiva en el directorio actual. Agregar -d
para eliminar los duplicados: se le preguntará qué archivos conservar; si, en cambio, agrega -dN
, fdupes siempre conservará el primer archivo y eliminará los demás archivos.
Respuesta3
Escribí un script que cambia el nombre de tus archivos para que coincidan con un hash de su contenido.
Utiliza un subconjunto de los bytes del archivo para que sea rápido y, si hay una colisión, agrega un contador al nombre como este:
3101ace8db9f.jpg
3101ace8db9f (1).jpg
3101ace8db9f (2).jpg
Esto hace que sea fácil revisar y eliminar duplicados por tu cuenta, sin confiar tus fotos al software de otra persona más de lo necesario.
Guion: https://gist.github.com/SimplGy/75bb4fd26a12d4f16da6df1c4e506562
Respuesta4
Esto se hace con la ayuda de la aplicación EagleFiler, desarrollada 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
También puede eliminar automáticamente los duplicados con el eliminador de archivos duplicados sugerido enesta publicación.