Precisa de ajuda para copiar arquivos na linha de comando

0

Eu tenho essa pasta de 700 GB e alguns desses arquivos sã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. Eu quero pegar todos os arquivos nesta pasta de 700 GB recursivamente e copiá-lo 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 forem do mesmo tamanho, o arquivo será ignorado, mas, se dois arquivos tiverem o mesmo nome e tamanhos diferentes, os dois arquivos serão mantidos. De alguma forma eu posso fazer isso?

    
por user245115 15.06.2015 / 21:37

2 respostas

1

Pergunta complicada, uma vez que os dupes precisam ser renomeados, mas também os renomeados dupes precisam ser verificados por tamanho para todos os seus (possivelmente) renomeados "fellows".

O que faz

Tanto quanto eu posso ver (e testado), o script abaixo faz isso. Ele renomeia possíveis duplicatas para [dupe_1]<file> , [dupe_1]<file> etc (se forem de tamanho diferente) e verifica após cada renomeação se o tamanho do arquivo corresponde ao dupe movido ou a suas 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, salve-o como reorganize.py
  2. Na seção head do script, defina os caminhos para o diretório de origem e destino
  3. Execute-o pelo comando:

    python3 /path/to/reorganize.py
    

Notas

  • Por favor, teste primeiro uma pequena amostra
  • Tenha em mente que isso possivelmente criará um diretório enorme "flat", que não será navegável pelo nautilus.
por Jacob Vlijm 15.06.2015 / 22:58
1

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
    
por Daniel 15.06.2015 / 22:27