3 votos

Eliminar todos los archivos duplicados

He importado accidentalmente imágenes de una aplicación dos veces, resultando en una lista que repite este patrón:

filename1.ext
filename1 2.ext
filename2.ext
filename2 2.ext

unas 5.000 veces.

Todos los detalles (fecha de creación, fecha de modificación, etc.) coinciden, excepto el " 2" justo antes de la extensión.

Puedo borrarlas manualmente, pero no creo que nadie considere esto una tarea agradable.

¿Puede alguien recomendar un método - quizás un código de Terminal - que borre todos los " 2" artículos de una sola vez?

Tenga en cuenta que los elementos y sus duplicados están restringidos a una sola carpeta.

Hay un patrón obvio aquí ( " 2.ext" ) pero no tengo ni idea de cómo usarlo.

17voto

Keiji Puntos 271

Respuesta de nohillside para usar rm *\ 2.ext funcionará bien, pero si quieres tener más confianza en que está haciendo lo correcto, puedes usar en su lugar

mkdir to_be_deleted
mv -- *\ 2.ext to_be_deleted

Eso pondrá todos los archivos que quieres eliminar en una carpeta separada - entonces puedes usar el finder (o lo que sea) para comprobar qué archivos están todavía en la carpeta original, y cuáles han sido movidos. Cuando estés contento de que todo esté bien, borra la carpeta to_be_deleted carpeta.

Gracias a fd0 por sugerir el -- argumento.

13voto

Oskar Puntos 1242

Por mucho que me guste el shell, es implacable con los comodines y los espacios en general y peor si tu script llega a carpetas que no esperabas. Tu caso de todo dentro de una carpeta y sin recursividad limita tu riesgo a script esta limpio .

Para prepararse, vacíe la papelera (para poder ver/revertir esto fácilmente si es necesario) y considere la posibilidad de hacer una copia de seguridad - un gran consejo cada vez que esté a punto de automatizar la destrucción de miles de archivos justo al lado de los que espera conservar.

En el buscador, busque el espacio 2.ext con comillas. Seleccione la búsqueda en su carpeta para asegurarse de que no está buscando en todas partes y contar los resultados.

" 2.ext"

  • Command + A
  • Command + Delete

9voto

En la terminal, rm *\ 2.ext debería funcionar.

PD: Para asegurarse de que se eliminan los archivos correctos, ejecute ls *\ 2.ext primero, o utilizar rm -i *\ 2.ext para que se le pregunte por cada archivo.

0voto

Random Person Puntos 31

Como han señalado otros, podría haber problemas aquí con la secuencia de comandos de la shell dependiendo de cómo se hicieron los duplicados. Teóricamente podrías evitarlos copiando la carpeta y probando primero, pero la única manera de verificar totalmente es si los revisas a mano, lo que en cierto modo desvirtúa el propósito.

Este es un archivo de Python que uso para una deduplicación similar que pueda tener. Escanea la carpeta en busca de archivos usando su sha256, retiene el nombre de archivo más alto alfabéticamente (que generalmente debería mantener los nombres de archivo más limpios) y elimina los demás. Puedes cambiar la variable dry_run de la antepenúltima línea a true así:

if __name__ == '__main__':
d = Deduplicator(path, dry_run=True)
d.deduplicate()

Para verificar que los archivos que quieres borrar son los que realmente se van a eliminar. Y, por supuesto, cambie la línea 4 de /ruta/a/sus/archivos por el directorio real donde están los archivos.

Para ejecutar, en un mac debería ser simplemente capaz de ejecutar:

python /path/to/your/deduplicate.py

Donde /ruta/para/tu/script es donde guardas este archivo .py. Básicamente, ponga lo siguiente en un archivo de texto y nómbrelo deduplicate.py:

import os
import hashlib

path = '/path/to/your/files'

class Deduplicator:
    def __init__(self, path, dry_run=True):
        self.path = path
        self.file_dict = dict()
        self.dry_run = dry_run

    def deduplicate(self):
        self.get_files()
        self.clean_files()

    def get_file_hash(self, file_path):
        with open(file_path, 'rb') as f:
            file = f.read()
            hash = hashlib.sha256(file).hexdigest()
            return hash

    def get_files(self):
        # Loop through the directory
        for file in os.listdir(path):
            # Get the file hash
            hash = self.get_file_hash(os.path.join(self.path, file))

            # If we haven't seen the hash yet, go ahead and initiate the list
            if not self.file_dict.get(hash):
                self.file_dict[hash] = list()

            # Then add this filename to that hashed value
            self.file_dict[hash].append(file)

    def clean_files(self):
        for hash, file_names in self.file_dict.items():
            file_names.sort(reverse=True)
            files_to_delete = file_names[:-1]
            print(f"File to keep: {file_names[0]}")
            print(f'Files to delete: {files_to_delete}')
            print('-'*50)
            if not self.dry_run:
                for file in files_to_delete:
                    full_path = os.path.join(path,file)
                    print(f"...deleting: {full_path}")
                    os.remove(full_path)

if __name__ == '__main__':
    d = Deduplicator(path, dry_run=False)
    d.deduplicate()

0voto

Naveed Abbas Puntos 126

Una opinión muy impopular es la de utilizar un software dedicado a la eliminación de duplicados en lugar de tratar de enredar con el terminal. Incluso si eres un usuario pro-terminal podrías terminar borrando archivos importantes.

Hay pocas razones.

  1. Los programas informáticos se desarrollan después de haber superado muchos casos.
  2. Comparan el contenido de los archivos en lugar de basarse únicamente en su nombre.
  3. Proporcionan una interfaz que llama la atención sobre los detalles importantes.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X