Với -I
, xargs
nhận được một đối số trên mỗi dòng trái ngược với mặc định của một đối số cho mỗi từ (phân cách trống hoặc dòng mới, có thể được trích dẫn) mà không có -I
(và ngụ ý -n
). Vì vậy, trong ví dụ của bạn date
chỉ được gọi một lần với {}
mở rộng ra toàn bộ đầu ra của echo
(nằm trên một dòng), trừ đi dòng mới.
Ở đây bạn có thể làm (lưu ý rằng đó -d
là một phần mở rộng GNU):
printf '%s\n' {1..12}/01 | xargs -I {} date -d {} +%b | xargs mkdir --
(lưu ý rằng nó sẽ không hoạt động chính xác ở các địa phương nơi các chữ viết tắt tên tháng chứa khoảng trắng hoặc ký tự trích dẫn; với GNU xargs
, bạn có thể xử lý xung quanh bằng cách sử dụng xargs -d '\n' mkdir --
)
Bây giờ, để có được danh sách các chữ viết tắt tháng trong ngôn ngữ của bạn, truy vấn trực tiếp miền địa phương sẽ có ý nghĩa hơn:
(IFS=';'; set -o noglob; mkdir -- $(locale abmon))
(xem thêm locale -k LC_TIME
để xem tất cả dữ liệu miền địa phương trong LC_TIME
danh mục).
Hoặc nguyên bản trong zsh
:
zmodload zsh/langinfo
mkdir -- ${(v)langinfo[(I)ABMON_*]}
Ít nhất là trên các hệ thống GNU, ở một số địa phương, các chữ viết tắt tháng được đệm theo chiều rộng cố định với khoảng trắng:
$ 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月
Bạn có thể muốn loại bỏ phần đệm đó.
Các không gian hàng đầu sẽ được loại bỏ xargs -I
, nhưng không phải là không gian. Với zsh
:
zmodload zsh/langinfo
set -o extendedglob
mkdir -- ${${${(v)langinfo[(I)ABMON*]}##[[:space:]]#}%%[[:space:]]#}