web-dev-qa-db-ja.com

月名のみのディレクトリを作成する

好奇心で質問を投稿して、1月、2月…12月のようなディレクトリを作りたかったので、個別に名前を付けて作成しました。 (mkdir January February .... etc)すべての月の名前を持つディレクトリまたはファイル名を簡単な方法で作成することは可能ですか?

例えば ​​: touch {1..10}は、10個のファイル1、2、3 ... 10を簡単に作成します。これは、月の名前でファイルまたはディレクトリを作成する他の解決策があるのですか?

8
karthik

POSIXly、

(IFS=';'; set -f; mkdir -- $(locale mon))

現在の言語での月名です。ユーザーの言語に関係なく英語を使用する場合は、LC_ALL=C locale monに置き換えます。

zshを使用すると、$langinfo特殊連想配列(zsh/langinfoモジュール内)も使用できます。

zmodload zsh/langinfo
eval mkdir -- '$langinfo[MON_'{1..12}']'

でも

mkdir -- ${(s:;:)"$(locale mon)"}

短くなります。 rc/esは、区切り記号を指定できる他のシェルであり、セパレーターを指定できます(Bourneのようなシェルのようなグローバル$IFS設定以外):

mkdir -- ``';'{locale mon}
18

heemayl's script の変更

for i in {1..12} ; do
   mkdir $(LC_TIME=C date +%B -d "${i}/15")
done

ループなし

LC_TIME=C date +%B -f <(printf "%d/15\n" {1..12}) | xargs mkdir
9
Costas

GNU dateでループ構造を使用できます。これは+1 month+2 monthsのような入力を取ります:

i=1; while ((i<=12)); do mkdir "$(date -d "+$i month" '+%B')"; ((i++)); done

例:

$ i=1; while ((i<=12)); do date -d "+$i month" '+%B'; ((i++)); done
September
October
November
December
January
February
March
April
May
June
July
August
8
heemayl

Pythonは月の名前をすべて知っています。

_mkdir $(python -c 'import calendar; print(" ".join(calendar.month_name))')
_

または、pythonを直接使用してディレクトリを作成することもできます。

_python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'
_

上記の中心は[os.mkdir(m) for m in calendar.month_name if m]で、毎月のディレクトリを_calendar.month_name_に作成します。これにより、エラーメッセージが生成され、ディレクトリがすでに存在する場合は終了します。それを避けたい場合は、mkdirを呼び出す前にディレクトリの存在をテストできます。

_python -c 'import calendar,os;[os.mkdir(m) for m in calendar.month_name if m and not os.path.exists(m)]'
_

例:

_$ python -c 'import calendar,os;[os.mkdir(m) for m in calendar.month_name if m]'
$ ls
April   December  January  June   May       October
August  February  July     March  November  September
_

国際化

StéphaneChazelasは、上記は英語の月名を出力していると指摘しています。現地の月名を取得するには、次のように提案します。

_python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'
_
4
John1024

ロケールの使用とLinuxの想定(locale(1)の出力は他のシステムでは異なります)およびbash(1)

#! /bin/sh
(
    eval "$( locale -k -c LC_TIME | grep ^mon= )" || exit
    IFS=\; months=($mon)
    mkdir "${months[@]}"
)
2
Satō Katsura