如何创建以每月命名的目录?

如何创建以每月命名的目录?

我想为每个月创建一个目录名称。在玩了一些 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

相关内容