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
- Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter
reorganize.py
- Im Kopfbereich des Skripts werden die Pfade zum Quell- und Zielverzeichnis angegeben.
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