毎月名前を付けたディレクトリを作成するには?

毎月名前を付けたディレクトリを作成するには?

毎月ディレクトリ名を作りたいです。シェルを少し遊んでから、私は次のことを見つけました。

date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec

だから私は中かっこ拡張を使っecho {1..12}/01xargsこれを試しました。

echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b

しかし、厄介に失敗しました:/(後で申請したかったmkdir)。どうすればいいですか?

ベストアンサー1

-I、を使用すると、xargs単語ごとに1つの引数(スペースまたは改行で区切られ、引用可能)ではなく、1行に1つの引数を取得できます。これはなし-I(および暗黙的-n)です。したがって、あなたの例ではdate一度だけ呼び出され、末尾の{}改行文字を除く出力全体(1行)に展開されます。echo

ここで行うことができます(これは-dGNU拡張です):

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:]]#}

おすすめ記事