Necesita ayuda para copiar archivos en la línea de comando

Necesita ayuda para copiar archivos en la línea de comando

Tengo esta carpeta que tiene la friolera de 700 GB y algunos de esos archivos están duplicados. Muchos de ellos tienen el mismo nombre, algunos duplicados y otros no. Básicamente, tengo alrededor de 30 carpetas dentro de esa carpeta, llenas de archivos y más carpetas. Quiero tomar todos los archivos de esta carpeta de 700 GB de forma recursiva y copiarlos de forma no recursiva a otro directorio. Cualquier conflicto se manejará según el tamaño. Si dos archivos tienen el mismo nombre y tienen el mismo tamaño, el archivo se omite, pero, si dos archivos tienen el mismo nombre y tienen diferentes tamaños, ambos archivos se conservan. ¿Alguna forma de hacer esto?

Respuesta1

Pregunta complicada, ya que hay que cambiar el nombre de los incautos, pero tambiénrenombradoLos incautos deben verificarse por tamaño para todos sus (posiblemente) "compañeros" previamente renombrados.

Que hace

Por lo que puedo ver (y probar), el siguiente script hace eso. Cambia el nombre de los posibles duplicados a [dupe_1]<file>, [dupe_1]<file>etc. (si son de diferente tamaño) y comprueba después de cada cambio de nombre si el tamaño del archivo coincide con el duplicado movido o con sus versiones renombradas en el directorio de destino.

#!/usr/bin/env python3
import shutil
import os

#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---

def check_dupe(src, trg):
    return os.stat(src).st_size == os.stat(trg).st_size

for root, dirs, files in os.walk(dr):
    for file in files:
        # define src, target
        src = root+"/"+file; trg = dr2+"/"+file
        if not os.path.exists(trg):
            # if target does not exist: move file
            shutil.copy(src, trg)
        else:
            n = 1
            # rename the file, check after every renaming if file exists, if size differs
            while os.path.exists(trg):
                test = check_dupe(src, trg)
                if test != True:
                    trg = dr2+"/[dupe_"+str(n)+"]"+file
                    n += 1
                else:
                    break
            if test != True:
                shutil.copy(src, trg)

Cómo utilizar

  1. Copie el script en un archivo vacío, guárdelo comoreorganize.py
  2. En la sección principal del script, establezca las rutas al directorio de origen y de destino.
  3. Ejecútelo con el comando:

    python3 /path/to/reorganize.py
    

Notas

  • Pruebe primero con una pequeña muestra.
  • Tenga en cuenta que esto posiblemente creará unaenormedirectorio "plano", que nautilus no podrá explorar.

Respuesta2

prueba esto:

cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
    if [ -e [destination_folder]/"$file" ]; then
        if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
            false
        else
            cp "$file" [destination_folder]/"$file"...
        fi
    else
        cp "$file" [destination_folder]/
    fi
    echo "$file copied"
done

información relacionada