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.pyEjecú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.findtambién permite muchos más criterios de coincidencia que el globping de shell. Una alternativa es establecer lanullglobopción de shell y cerrar el flujo de entrada estándar deprename. 1En ambos casos, quite el
-ninterruptor 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
zmvcomandos:La
mmvfunción crea el directorio y mueve el archivo.zmvluego 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
echoinmmvpara 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
echodespués de probar para mover realmente los archivosY entonces
eliminar
-nsi se ve bien después de la prueba y ejecutar de nuevo.fuente
if [[ -d "${i^}" ]]para hacer la variableicapital, 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, luegomkdirymv:fuente
trpara convertir a mayúsculas.xargssolo parabashvolver a llamar ? ¿No sería más simple y mucho más legible canalizar la salidafinden un bucle while yreadgrabarla por grabación?whileversión de bucle ( bit.ly/2j2mhyb ) es quizás mejor.{}sustitución si se dejaxargsappend el argumento y luego consulte$1el 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_!)