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}/01y 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

lsen 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,xargsobtiene 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,datese 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
-des 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_TIMEpara ver todos los datos locales en laLC_TIMEcategorí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 queseqPOSIX 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
-Icambios el delimitador de xargs:Puede agregar
-d " "a xargs para que funcione. Pero ni siquiera necesitas-I{}en tu caso:Prueba esto,
fuente
dateacepte opciones después de argumentos no opcionales como ese, no debe haber unaPOSIXLY_CORRECTvariable 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 {} +%bSolo inserte
\\nal final del eco.Luego para hacer que los directorios agreguen
|xargs mkdirp.ej
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdirfuente
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$IFSGNU no modificado ydatesimilar para sudate -d):fuente