Lo script python qui sotto fa il lavoro. I file nascosti vengono archiviati separatamente in una cartella, così come i file senza estensione.
Dal momento che potrebbe essere utilizzato per una vasta gamma di scopi, ho aggiunto alcune opzioni:
- Puoi impostare le estensioni che desideri escludere dalla "riorganizzazione". Se vuoi semplicemente spostare tutto, imposta
exclude = ()
- Puoi scegliere cosa fare con le cartelle vuote (
remove_emptyfolders = True
o False
)
- Nel caso in cui desideri copiare i file invece di spostarli , sostituisci la riga:
shutil.move(subject, new_dir+"/"+name)
di:
shutil.copy(subject, new_dir+"/"+name)
Il copione:
#!/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()
SE esiste il rischio di sovrascrivere i file duplicati indesiderati
A scapito di alcune righe extra, possiamo evitare di sovrascrivere possibili duplicati. Con il codice seguente, i duplicati verranno rinominati come:
duplicate_1_filename, duplicate_2_filename
eccetera.
Il copione:
#!/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()
MODIFICARE
Con in mente OP, ci siamo tutti dimenticati di aggiungere un'istruzione su come usare. Dal momento che potrebbero apparire ( e fare ) domande duplicate , potrebbe essere comunque utile.
Come usare
- Copia uno degli script in un file vuoto, salvalo come
reorganize.py
Nella sezione head dello script, imposta la directory target (con i file da riorganizzare):
reorg_dir = "/path/to/directory_to_reorganize"
(usa le virgolette se la directory contiene spazi)
possibili estensioni che desideri escludere (probabilmente nessuna, come di seguito):
exclude = ()
e se desideri rimuovere le cartelle vuote in seguito:
remove_emptyfolders = True
Esegui lo script con il comando:
python3 /path/to/reorganize.py
NB se desideri copiare i file anziché spostarli , sostituisci:
shutil.move(subject, new_dir+"/"+name)
di:
shutil.copy(subject, new_dir+"/"+name)
Prova prima un piccolo campione.
-iname '*.*'
dovrebbe prendere cura dei casi d'angolo ero preoccupato ... bella idea!