Consulte el comodín en el nombre del archivo

Consulte el comodín en el nombre del archivo

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 ay 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 bashse 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.

información relacionada