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!*.fig.bak
o.profile/.bashrc
los, pero al menos solo debe manejar archivos con extensiones. Gracias.Cálculo de la lista de extensiones (después de mover):
Cálculo de la lista de extensiones (antes de mover):
(en este último ejemplo, estamos calculando el número de archivos para cada extensión y ordenándolos)
fuente
ls -X | grep -Po '(?<=\.)(\w+)$'
fue mi primera idea para obtener la lista ordenada de extensiones. ¿Es muy malo? ¿Que sugieres?ls -X
hace. En cuanto a por qué lo recomiendols
, consulte unix.stackexchange.com/q/128985/70524 y unix.stackexchange.com/q/112125/70524 . Para lograr lo que haces, iría por un camino más largo:find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu
(con un opcional| uniq -cz
, si se necesitan conteos). Yfind ... -print0 | gawk -v RS='\0'
(aunque eso no es muy portátil ) para el primero.Prueba este script de shell.
fuente
filepath
confile
. Lo corregiré directamente.for file in "$src"/*?.?*; do ..
read
puede tener un comportamiento inesperado. También debe citar las variables en los comandos mkdir y mv.for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done
Si tiene instalado el cambio de nombre / nombre de Perl:
fuente