
Sé que puedo usar un comodín para extraer archivos con nombres de un formato específico en bash usando el asterisco, así:
$ ls
a01 a02 a03 a04 a05 a06 a07 a08 a09 b01 b02 b03 b04 b05 b06 b07 b08 b09
$ ls a*
a01 a02 a03 a04 a05 a06 a07 a08 a09
$ ls b*
b01 b02 b03 b04 b05 b06 b07 b08 b09
Pero si quisiera hacer algo como mover todos los archivos que comienzan con a a un directorio llamado a
y mover todos los archivos que comienzan con b a un directorio llamado b
, ¿cómo lo haría con un solo comando?
¿Puedes hacer algo como esto?
$ mv *0* */
¿Pero de alguna manera hacer referencia al primer asterisco en el argumento de paso a?
Respuesta1
Un comando, una línea:
for n in *;do [ -f "$n" ] && case "$n" in a*) mv "$n" a/;; b*) mv "$n" b/;; esac; done
Alternativamente, puede derivar el nombre del directorio a partir del nombre del archivo, pero no lo mostré inicialmente, estimando que sería una línea más larga. Por ejemplo, la declaración en el bucle sería (primer intento):
d=$(echo "$n" | sed -e 's/^\(.\).*/\1/'); [ -f "$n" ] && mv "$n" $d/
usaría la primera letra del nombre de archivo dado para obtener el nombre del directorio. Comparar con
[ -f "$n" ] && case "$n" in a*) mv "$n" a/;; *b) mv "$n" b/;; esac
para la declaración del caso. En realidad, no mucho más, pero es más difícil escribir sobre la marcha. Como bash
se menciona, se puede usar su sintaxis de subcadena ${parameter:offset:length}
para acortar esa línea:
d=${n:0:1}; [ -f "$n" ] && mv "$n" $d/
o
[ -f "$n" ] && mv "$n" ${n:0:1}/
(Recuerdo esto como una extensión de bash y no lo encuentro enPOSIX).
Con respecto a la pregunta real sobre la reutilización de comodines: eso aparentemente se refiere aexpansión de corsé. Estos se expanden antes del punto donde los necesitaría. Citando la documentación:
Se realiza la expansión del aparato ortopédico.antescualquier otra expansión y cualquier carácter especial de otras expansiones se conservan en el resultado. Esestrictamente textual. bash lo hacenoaplicar cualquier interpretación sintáctica al contexto de la expansión o al texto entre llaves. Para evitar conflictos con la expansión de parámetros, la cadena '${' no se considera apta para la expansión de llaves.