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 de echo
(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):
printf '%s\n' {1..12}/01 | xargs -I {} date -d {} +%b | xargs mkdir --
(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 utilizando xargs -d '\n' mkdir --
)
Ahora, para obtener la lista de abreviaturas de mes en su localidad, consultar la localidad directamente tendría más sentido:
(IFS=';'; set -o noglob; mkdir -- $(locale abmon))
(vea también locale -k LC_TIME
para ver todos los datos locales en la LC_TIME
categoría).
O de forma nativa en zsh
:
zmodload zsh/langinfo
mkdir -- ${(v)langinfo[(I)ABMON_*]}
Al menos en los sistemas GNU, en algunas configuraciones regionales, las abreviaturas de los meses se rellenan con un ancho fijo con espacios:
$ LC_ALL=et_EE.UTF-8 locale title abmon
Estonian locale for Estonia
jaan ;veebr;märts;apr ;mai ;juuni;juuli;aug ;sept ;okt ;nov ;dets
$ LC_ALL=zh_TW.UTF-8 locale title abmon
Chinese locale for Taiwan R.O.C.
1月; 2月; 3月; 4月; 5月; 6月; 7月; 8月; 9月;10月;11月;12月
Es posible que desee eliminar ese relleno.
Los espacios iniciales se eliminarían xargs -I
, pero no los espacios finales. Con zsh
:
zmodload zsh/langinfo
set -o extendedglob
mkdir -- ${${${(v)langinfo[(I)ABMON*]}##[[:space:]]#}%%[[:space:]]#}