Erstellen des Verzeichnisses nur mit dem Monatsnamen

8

Ich wollte neugierig Fragen stellen und wollte ein Verzeichnis wie Januar, Februar ... bis Dezember erstellen, also habe ich sie erstellt, indem ich den Namen individuell angegeben habe. ( mkdir January February.... etc) Ist es möglich, auf einfache Weise Verzeichnisse oder Dateinamen mit dem Namen aller Monate zu erstellen?

Beispiel: touch {1..10}Werden 10 Dateien 1,2,3 ... 10 einfach erstellt. Gibt es eine andere Lösung, um die Dateien oder das Verzeichnis mit dem Monatsnamen zu erstellen?

karthik
quelle

Antworten:

18

POSIXly,

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

Beachten Sie, dass es sich um die Monatsnamen in der aktuellen Sprache handelt. Ersetzen Sie durch, LC_ALL=C locale monwenn Sie die englischen unabhängig von der Sprache des Benutzers möchten.

Mit zshkönnen Sie auch das $langinfospezielle assoziative Array (im zsh/langinfoModul) verwenden:

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

Obwohl

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

wäre kürzer. In rc/ eswelche anderen Shells mit Aufteilungsoperatoren können Sie die Trennzeichen angeben (außer über diese globale $IFSEinstellung wie in Bourne-ähnlichen Shells):

mkdir -- ``';'{locale mon}
Stéphane Chazelas
quelle
9

Änderung von Heemayls Skript

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

Ohne Schleife

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

Sie können ein Schleifenkonstrukt mit GNU verwenden , datedie nimmt +1 month, +2 monthswie Eingänge:

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

Beispiel:

$ 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
heemayl
quelle
3
Setzen Sie i zu Beginn auf 5, um ab Januar zu starten.
123
2
@ 123 Sag es noch einmal 22 Tage;)
heemayl
4

Python kennt alle Namen der Monate:

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

Oder wir können Python direkt verwenden, um das Verzeichnis zu erstellen:

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

Das Herzstück des oben genannten ist [os.mkdir(m) for m in calendar.month_name if m], dass ein Verzeichnis für jeden Monat in erstellt wird calendar.month_name. Dies generiert eine Fehlermeldung und wird beendet, wenn eines der Verzeichnisse bereits vorhanden ist. Wenn wir das vermeiden wollen, können wir vor dem Aufruf testen, ob Verzeichnisse vorhanden sind mkdir:

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

Beispiel:

$ 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

Internationalisierung

Stéphane Chazelas weist darauf hin, dass oben englische Monatsnamen gedruckt werden. Um lokale Monatsnamen zu erhalten, schlägt er vor:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'
John1024
quelle
@ StéphaneChazelas Danke. Ich habe die Antwort aktualisiert. (Ihr locale monist überlegen und hat bereits meine +1.)
John1024
2

Verwenden von Gebietsschemas und Annahme von Linux (die Ausgabe von locale(1)ist auf anderen Systemen unterschiedlich) und bash(1):

#! /bin/sh
(
    eval "$( locale -k -c LC_TIME | grep ^mon= )" || exit
    IFS=\; months=($mon)
    mkdir "${months[@]}"
)
Satō Katsura
quelle
months=($mon)ist keine shSyntax. Das ist ksh93oder bashSyntax.
Stéphane Chazelas