Das folgende Python-Skript erledigt den Job. Versteckte Dateien werden separat in einem Ordner sowie Dateien ohne Erweiterung gespeichert.
Da es für einen breiteren Bereich von Zwecken verwendet werden kann, habe ich einige Optionen hinzugefügt:
- Sie können Erweiterungen festlegen, die Sie von der "Reorganisation" ausschließen möchten. Wenn Sie einfach alle verschieben möchten, legen Sie fest
exclude = ()
- Sie können auswählen, was mit leeren Ordnern geschehen soll (
remove_emptyfolders = True
oder False
)
- Für den Fall , möchten Sie kopieren die Dateien statt bewegen sie, ersetzen Sie die Zeile:
shutil.move(subject, new_dir+"/"+name)
durch:
shutil.copy(subject, new_dir+"/"+name)
Das Drehbuch:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
shutil.move(subject, new_dir+"/"+name)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
WENN die Gefahr besteht, dass doppelte Dateien ungewollt überschrieben werden
Auf Kosten einiger zusätzlicher Zeilen können wir das Überschreiben möglicher Duplikate verhindern. Mit dem folgenden Code werden Duplikate umbenannt in:
duplicate_1_filename, duplicate_2_filename
etc.
Das Drehbuch:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
n = 1; name_orig = name
while os.path.exists(new_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
newfile = new_dir+"/"+name
shutil.move(subject, newfile)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
BEARBEITEN
In Anbetracht von OP haben wir alle vergessen, eine Gebrauchsanweisung beizufügen. Da doppelte Fragen möglicherweise ( und tun) ), kann dies dennoch hilfreich sein.
Wie benutzt man
- Kopieren Sie eines der Skripte in eine leere Datei und speichern Sie es unter
reorganize.py
Legen Sie im Abschnitt head des Skripts das Zielverzeichnis fest (mit den zu reorganisierenden Dateien):
reorg_dir = "/path/to/directory_to_reorganize"
(Verwenden Sie Anführungszeichen, wenn das Verzeichnis Leerzeichen enthält.)
Mögliche Erweiterungen, die Sie ausschließen möchten (wahrscheinlich keine, wie unten):
exclude = ()
und wenn Sie danach leere Ordner entfernen möchten:
remove_emptyfolders = True
Führen Sie das Skript mit dem folgenden Befehl aus:
python3 /path/to/reorganize.py
Hinweis: Wenn Sie die Dateien kopieren möchten, anstatt sie zu verschieben , ersetzen Sie Folgendes :
shutil.move(subject, new_dir+"/"+name)
durch:
shutil.copy(subject, new_dir+"/"+name)
Bitte versuchen Sie es zuerst mit einer kleinen Probe.
-iname '*.*'
sollte sich um die Eckfälle kümmern, um die ich mir Sorgen gemacht habe ... nette Idee!