Precisa de ajuda com a cópia de arquivos na linha de comando

Precisa de ajuda com a cópia de arquivos na linha de comando

Eu tenho essa pasta com impressionantes 700 GB e alguns desses arquivos estão duplicados. Muitos deles têm o mesmo nome, alguns duplicados, outros não. Basicamente, tenho cerca de 30 pastas ao lado dessa pasta, cheias de arquivos e mais pastas. Quero pegar todos os arquivos nesta pasta de 700 GB recursivamente e copiá-los de forma não recursiva para outro diretório. Quaisquer conflitos serão tratados com base no tamanho. Se dois arquivos tiverem o mesmo nome e tamanho, o arquivo será ignorado, mas, se dois arquivos tiverem o mesmo nome e tamanhos diferentes, ambos os arquivos serão mantidos. De alguma forma eu posso fazer isso?

Responder1

Pergunta complicada, já que os idiotas precisam ser renomeados, mas tambémrenomeadoos ingênuos devem ser verificados por tamanho para todos os seus (possivelmente) "companheiros" anteriormente renomeados.

O que faz

Pelo que pude ver (e testado), o script abaixo faz isso. Ele renomeia possíveis duplicatas para [dupe_1]<file>, [dupe_1]<file>etc (se forem de tamanhos diferentes) e verifica após cada renomeação se o tamanho do arquivo corresponde ao duplicado movido ou às versões renomeadas no diretório 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)

Como usar

  1. Copie o script em um arquivo vazio e salve-o comoreorganize.py
  2. Na seção head do script, defina os caminhos para o diretório de origem e de destino
  3. Execute-o pelo comando:

    python3 /path/to/reorganize.py
    

Notas

  • Por favor, teste primeiro em uma pequena amostra
  • Lembre-se de que isso possivelmente criará umenormeDiretório "flat", que não será navegável pelo nautilus.

Responder2

tente isto:

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

informação relacionada