El script de Python a continuación hace el trabajo. Los archivos ocultos se almacenan por separado en una carpeta, así como los archivos sin extensión.
Como podría usarse para una gama más amplia de propósitos, agregué algunas opciones:
- Puede establecer extensiones que le gustaría excluir de la "reorganización". Si simplemente quiere mover todo, configure
exclude = ()
- Puedes elegir qué hacer con las carpetas vacías (
remove_emptyfolders = True
o False
)
- En caso de que desee copiar los archivos en lugar de moverlos , reemplace la línea:
shutil.move(subject, new_dir+"/"+name)
por:
shutil.copy(subject, new_dir+"/"+name)
La secuencia de comandos:
#!/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()
SI existe el riesgo de sobrescribir archivos duplicados no deseados
A expensas de algunas líneas adicionales, podemos evitar sobrescribir posibles duplicados. Con el siguiente código, los duplicados se renombrarán como:
duplicate_1_filename, duplicate_2_filename
etc.
La secuencia de comandos:
#!/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()
EDITAR
Con OP en mente, todos olvidamos agregar una instrucción sobre cómo usar. Dado que pueden aparecer ( y aparecen) preguntas duplicadas , sin embargo, puede ser útil.
Cómo utilizar
- Copie cualquiera de los scripts en un archivo vacío, guárdelo como
reorganize.py
En la sección principal del script, configure el directorio de destino (con los archivos para reorganizar):
reorg_dir = "/path/to/directory_to_reorganize"
(use comillas si el directorio contiene espacios)
posibles extensiones que desea excluir (probablemente ninguna, como a continuación):
exclude = ()
y si luego desea eliminar carpetas vacías:
remove_emptyfolders = True
Ejecute el script con el comando:
python3 /path/to/reorganize.py
Nota: si desea copiar los archivos en lugar de moverlos , reemplace:
shutil.move(subject, new_dir+"/"+name)
por:
shutil.copy(subject, new_dir+"/"+name)
Por favor, intente primero con una muestra pequeña.
-iname '*.*'
debería ocuparse de los casos de esquina que me preocupaban ... ¡Buena idea!