Separa los archivos por nombre en carpetas diferentes

2

Si tengo una carpeta que contiene varios archivos con el mismo patrón, por ejemplo:

 file1a
 file1b
 file1c
 file2a
 file2b
 file2c
 ...

¿Hay una sola línea para separarlos en carpetas llamadas:

file1/file1a, file1b, file1c
file2/file2a, file2b, file2c

Qué es variable: número de esas carpetas.

lhcgeneva
fuente

Respuestas:

2

Con un for lazo:

for f in file*; do 
  mkdir -p "${f%%[^0-9]}"
  mv -v "$f" "${f%%[^0-9]}/"
done

  • Recorre todos los archivos del directorio que comienza con file.
  • mkdir -p crea el directorio si no existe.
    • ${f%%[^0-9]}: esto elimina la parte que no ^ contiene números de la parte posterior del nombre de archivo; ese es el nombre del directorio
  • Y finalmente mv Mueve el archivo en el directorio correspondiente.

El árbol de directorios después de la ejecución:

├── file1
│   ├── file1a
│   ├── file1b
│   └── file1c
└── file2
    ├── file2a
    ├── file2b
    └── file2c
chaos
fuente
Una cosa más: en lugar de eliminar la parte que no contiene números, ¿hay una forma general de eliminar algo DESPUÉS del número? (El siguiente dígito después del número no será un número, pero después podría ser cualquier cosa)
lhcgeneva
1
@lhcgeneva Pruébalo con sed 's/\([0-9]\+\).*/\1/' <<<"$f". Esto elimina todo después del primer número.
chaos
Ok, he intentado varias cosas ahora, no puedo hacer que funcione. Pregunta estúpida, ¿dónde pongo el comentario anterior? : D habría pensado algo así mkdir -p "${sed 's/\([0-9]\+\).*/\1/' <<<"$f"}/" pero eso me da mala expansión
lhcgeneva
@lhcgeneva Lo siento, si no estaba claro. Me refería: mkdir -p $(sed 's/\([0-9]\+\).*/\1/' <<<"$f") y mv -v "$f" "$(sed 's/\([0-9]\+\).*/\1/' <<<"$f")".
chaos
Parece que esto no me funciona, pero creo que he encontrado una manera de evitarlo utilizando la indexación, ¡así que no se preocupe y gracias!
lhcgeneva