我想为每个月创建一个目录名称。在玩了一些 shell 之后,我知道:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
所以我使用了大括号扩展,echo {1..12}/01
并尝试了xargs
它:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
但它惨遭失败:/(后来我想申请mkdir
)。我怎样才能做到这一点?
答案1
使用-I
,xargs
每行获取一个参数,而不是默认每个单词(空白或换行符分隔,可能引用)一个参数,而没有-I
(并暗示-n
)。因此,在您的示例中,date
仅调用一次并扩展到(在一行上){}
的整个输出,减去尾随换行符。echo
你可以在这里做(注意这-d
是一个 GNU 扩展):
printf '%s\n' {1..12}/01 | xargs -I {} date -d {} +%b | xargs mkdir --
(请注意,它在月份名称缩写包含空格或引号字符的语言环境中无法正常工作;使用 GNU xargs
,您可以使用 来解决这个问题xargs -d '\n' mkdir --
)
现在,要获取您所在区域中的月份缩写列表,直接查询区域设置会更有意义:
(IFS=';'; set -o noglob; mkdir -- $(locale abmon))
(另请参阅locale -k LC_TIME
查看LC_TIME
类别中的所有区域设置数据)。
或者本地zsh
:
zmodload zsh/langinfo
mkdir -- ${(v)langinfo[(I)ABMON_*]}
至少在 GNU 系统上,在某些语言环境中,月份缩写会用空格填充为固定宽度:
$ 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月
您可能想要删除该填充。
前导空格将被 删除xargs -I
,但尾随空格不会被删除。和zsh
:
zmodload zsh/langinfo
set -o extendedglob
mkdir -- ${${${(v)langinfo[(I)ABMON*]}##[[:space:]]#}%%[[:space:]]#}
答案2
尝试循环吗?
$ for m in {1..12}; do
> date -d "$m"/01 +%b
> done
jan
feb
mar
apr
maj
jun
jul
aug
sep
okt
nov
dec
如果你想为每个月制作一个目录,我会这样做:
for m in {1..12}; do newdir=$(date -d "$m"/01 +%b); mkdir "$newdir"; done
答案3
在带有大括号扩展和接受数据文件输入的日期的 shell 中,尝试
echo {01..12}/01$'\n' | date -f- +"mkdir %b"
如果对结果满意的话,可以通过管道输入 shell。
答案4
你离这里如此之近。
问题是 echo 生成单行1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
,并且 xargs 使用换行符作为字段分隔符(而不是空格)。
解决方案:告诉 echo 在每个字段之间放置一个空格。
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
\\n
我只在回声的末尾插入。
然后让目录添加|xargs mkdir
例如
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir