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!*.fig.bak
oder.profile/.bashrc
, aber es sollte zumindest nur Dateien mit Erweiterungen verarbeiten. Vielen Dank.Berechnen der Liste der Erweiterungen (nach dem Verschieben):
Berechnen der Liste der Erweiterungen (vor dem Verschieben):
(In diesem letzten Beispiel berechnen wir die Anzahl der Dateien für jede Erweiterung und sortieren sie.)
quelle
ls -X | grep -Po '(?<=\.)(\w+)$'
war meine erste Idee, die sortierte Liste der Erweiterungen zu bekommen. Ist es sehr schlecht? Was schlagen Sie vor?ls -X
tut. Informationen darüber , warum ich dagegen empfehlels
, finden Sie unter unix.stackexchange.com/q/128985/70524 und unix.stackexchange.com/q/112125/70524 . Um das zu erreichen, was Sie tun, würde ich einen längeren Weg gehen:find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu
(mit einem optionalen| uniq -cz
, wenn Zählungen benötigt werden). Undfind ... -print0 | gawk -v RS='\0'
(obwohl das nicht sehr portabel ist ) erstens.Versuchen Sie dieses Shell-Skript.
quelle
filepath
mit ersetzen müssenfile
. Ich werde das direkt korrigieren.for file in "$src"/*?.?*; do ..
read
möglicherweise unerwartetes Verhalten. Sie sollten auch die Variablen in den Befehlen mkdir und mv in Anführungszeichen setzen.for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done
Wenn Sie Perls Umbenennung / Vornamen installiert haben:
quelle