Estoy buscando una forma (preferiblemente terminal) para organizar más de 1000 fuentes por su primera letra.
Básicamente, cree directorios y A-Z, #
luego mueva los archivos de fuente a esos directorios según el primer carácter de su nombre de archivo. Fuentes que comienzan con números [0-9] u otros caracteres especiales para mover al #
directorio.
command-line
files
Parto
fuente
fuente
Respuestas:
Una opción de Python tardío:
Cómo utilizar
move_files.py
Ejecútelo con el directorio como argumento:
El script solo creará el (sub) directorio (-ies) (mayúscula) si es realmente necesario
Explicación
La secuencia de comandos:
enumera los archivos, obtiene el primer carácter (define la ruta de origen):
comprueba si el artículo es un archivo:
define la carpeta de destino para si el primer carácter es alfa o no:
comprueba si la carpeta ya existe o no, la crea si no:
mueve el elemento a su carpeta correspondiente:
fuente
Código de golf pero legible con solo dos comandos y dos expresiones regulares:
Si tiene una gran cantidad de archivos para mover, demasiados para caber en la lista de argumentos del proceso (sí, hay un límite y puede ser solo unos pocos kilobytes), puede generar la lista de archivos con un comando diferente y canalizar eso a
prename
, p.ej:Esto tiene el beneficio adicional de no intentar mover el nombre literal del archivo
[[:alnum:]]?*
si ningún archivo coincide con el patrón global.find
también permite muchos más criterios de coincidencia que el globping de shell. Una alternativa es establecer lanullglob
opción de shell y cerrar el flujo de entrada estándar deprename
. 1En ambos casos, quite el
-n
interruptor para mover realmente los archivos y no solo muestre cómo se moverían.Anexo: Puede eliminar los directorios vacíos nuevamente con:
1
shopt -s nullglob; prename ... <&-
fuente
Si no le importa zsh, una función y un par de
zmv
comandos:La
mmv
función crea el directorio y mueve el archivo.zmv
luego proporciona coincidencia de patrones y sustitución. Primero, moviendo los nombres de archivo que comienzan con un alfabeto, luego todo lo demás:Ejecute nuevamente sin la definición de
echo
inmmv
para realizar el movimiento.fuente
No encontré una buena manera de poner los nombres de directorio en mayúsculas (o mover los archivos con letras mayúsculas), aunque luego podría hacerlo con
rename
...o más legible:
Eliminar
echo
después de probar para mover realmente los archivosY entonces
eliminar
-n
si se ve bien después de la prueba y ejecutar de nuevo.fuente
if [[ -d "${i^}" ]]
para hacer la variablei
capital, ymkdir {A..Z}
al principio.Los siguientes comandos dentro del directorio que contiene las fuentes deberían funcionar, si desea usarlos desde fuera del directorio de almacenamiento de fuentes, cambie
for f in ./*
afor f in /directory/containing/fonts/*
. Este es un método muy basado en shell, muy lento, y también no es recursivo. Esto solo creará directorios, si hay archivos que comienzan con el carácter correspondiente.Como una línea, nuevamente desde el directorio de almacenamiento de fuentes:
Un método que utiliza find, con una manipulación de cadenas similar, que utiliza la expansión de parámetros bash, que será recursivo y debería ser algo más rápido que la versión de shell pura:
O más legible:
fuente
Asigne cada nombre de archivo a un nombre de directorio usando
tr
, luegomkdir
ymv
:fuente
tr
para convertir a mayúsculas.xargs
solo parabash
volver a llamar ? ¿No sería más simple y mucho más legible canalizar la salidafind
en un bucle while yread
grabarla por grabación?while
versión de bucle ( bit.ly/2j2mhyb ) es quizás mejor.{}
sustitución si se dejaxargs
append el argumento y luego consulte$1
el interior de la secuencia de comandos shell, por ejemplo:xargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. (¡Cuidado con la final_
!)