Me gustaría crear un nombre de directorio para cada mes. Sé, después de jugar un poco con el caparazón, que:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
Así que utilicé la expansión de llaves echo {1..12}/01
y lo intenté xargs
:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
Pero falla miserablemente: / (luego me gustaría aplicar mkdir
). ¿Cómo puedo hacer esto?
shell-script
xargs
bash-expansion
JammingThebBits
fuente
fuente
ls
en orden alfabético (abril, agosto, diciembre, febrero, enero, julio, junio, marzo, mayo, noviembre, octubre, septiembre).mkdir january february [...]
? A menos que realmente necesite crearlos por separado, no es necesario hacerlo de la manera que sugirió.Respuestas:
Con
-I
,xargs
obtiene un argumento por línea en lugar del valor predeterminado de un argumento por palabra (en blanco o nueva línea delimitada, posiblemente citada) sin-I
(e implica-n
). Entonces, en su ejemplo,date
se llama solo una vez con{}
expandido a toda la salida deecho
(que está en una línea), menos la nueva línea final.Aquí puede hacer (tenga en cuenta que
-d
es una extensión de GNU):(tenga en cuenta que no funcionará correctamente en entornos locales donde las abreviaturas de los nombres de los meses contienen espacios o comillas; con GNU
xargs
, puede solucionarlo utilizandoxargs -d '\n' mkdir --
)Ahora, para obtener la lista de abreviaturas de mes en su localidad, consultar la localidad directamente tendría más sentido:
(vea también
locale -k LC_TIME
para ver todos los datos locales en laLC_TIME
categoría).O de forma nativa en
zsh
:Al menos en los sistemas GNU, en algunas configuraciones regionales, las abreviaturas de los meses se rellenan con un ancho fijo con espacios:
Es posible que desee eliminar ese relleno.
Los espacios iniciales se eliminarían
xargs -I
, pero no los espacios finales. Conzsh
:fuente
locale abmon
.IFS=';'; set -o noglob; mkdir -- $(locale abmon)
. ;)Prueba un bucle?
Si desea hacer un directorio para cada mes, haría algo como:
fuente
{1..12}
es un bashismo. Para un shell POSIX, usefor m in $(seq 1 12)...
(aunque tenga en cuenta queseq
POSIX en sí mismo no es obligatorio){1..12}
es un zshismo, copiado más tarde por ksh93, bash y varios otros proyectiles.En los shells con expansión de llaves y la fecha que acepta la entrada DATAFILE, intente
y la tubería en la cáscara si está satisfecho con el resultado.
fuente
Su comando no funciona, debido al uso de
-I
cambios el delimitador de xargs:Puede agregar
-d " "
a xargs para que funcione. Pero ni siquiera necesitas-I{}
en tu caso:Prueba esto,
fuente
date
acepte opciones después de argumentos no opcionales como ese, no debe haber unaPOSIXLY_CORRECT
variable en el entorno.Estás tan cerca.
El problema es que echo está produciendo una sola línea
1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
, y que xargs está usando el carácter de nueva línea como un separador de campo (no el espacio).La solución: dile a echo que ponga un espacio entre cada campo.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Solo inserte
\\n
al final del eco.Luego para hacer que los directorios agreguen
|xargs mkdir
p.ej
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir
fuente
La forma más simple y robusta de hacer esto:
Es una lista estática de meses después de todo ...
Si tiene la intención de usar GNU
date
(aquí suponiendo un$IFS
GNU no modificado ydate
similar para sudate -d
):fuente