
毎月ディレクトリ名を作りたいです。シェルを少し遊んでから、私は次のことを見つけました。
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
単語ごとに1つの引数(スペースまたは改行で区切られ、引用可能)ではなく、1行に1つの引数を取得できます。これはなし-I
(および暗黙的-n
)です。したがって、あなたの例ではdate
一度だけ呼び出され、末尾の{}
改行文字を除く出力全体(1行)に展開されます。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
中かっこ拡張があり、日付をデータファイル入力として受け入れるシェルで、次のことを試してください。
echo {01..12}/01$'\n' | date -f- +"mkdir %b"
結果がうまくいけば、入力をシェルにパイプできます。
答え4
あなたはここに非常に近いです。
問題は、echoが1行を生成し、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