Brauche Hilfe beim Kopieren von Dateien in der Befehlszeile

Brauche Hilfe beim Kopieren von Dateien in der Befehlszeile

Ich habe diesen Ordner mit satten 700 GB und einige dieser Dateien sind doppelt vorhanden. Viele davon haben den gleichen Namen, einige sind doppelt vorhanden, andere nicht. Im Grunde habe ich in diesem Ordner etwa 30 Ordner, die mit Dateien und weiteren Ordnern gefüllt sind. Ich möchte alle Dateien in diesem 700 GB großen Ordner rekursiv erfassen und nicht rekursiv in ein anderes Verzeichnis kopieren. Alle Konflikte werden basierend auf der Größe behandelt. Wenn zwei Dateien den gleichen Namen und die gleiche Größe haben, wird die Datei übersprungen, aber wenn zwei Dateien den gleichen Namen und unterschiedliche Größen haben, werden beide Dateien behalten. Wie kann ich das tun?

Antwort1

Komplizierte Frage, da Duplikate umbenannt werden müssen, aber auchumbenanntDuplikate müssen hinsichtlich der Größe auf alle (möglicherweise) zuvor umbenannten „Artgenossen“ geprüft werden.

Was es macht

Soweit ich es sehe (und getestet habe), macht das folgende Skript das. Es benennt mögliche Duplikate in [dupe_1]<file>usw. um [dupe_1]<file>(wenn sie unterschiedliche Größe haben) und prüft nach jeder Umbenennung, ob die Größe der Datei entweder mit dem verschobenen Duplikat oder seinen umbenannten Versionen im Zielverzeichnis übereinstimmt.

#!/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)

Wie benutzt man

  1. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unterreorganize.py
  2. Im Kopfbereich des Skripts werden die Pfade zum Quell- und Zielverzeichnis angegeben.
  3. Führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/reorganize.py
    

Anmerkungen

  • Bitte zuerst an einer kleinen Probe testen
  • Bedenken Sie, dass dies möglicherweise zu einerriesig„flaches“ Verzeichnis, das von Nautilus nicht durchsucht werden kann.

Antwort2

Versuche dies:

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

verwandte Informationen