création du répertoire avec le nom du mois uniquement

8

Posant une question par curiosité, je voulais créer des répertoires comme janvier, février ... à décembre donc je les ai créés en donnant individuellement le nom. ( mkdir January February.... etc) Est-il possible de créer facilement des répertoires ou des noms de fichiers avec le nom de tous les mois?

par exemple: touch {1..10}va créer 10 fichiers 1,2,3 ... 10 facilement, comme celui-ci, existe-t-il une autre solution pour créer les fichiers ou le répertoire avec le nom du mois?

karthik
la source

Réponses:

18

POSIXly,

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

Notez que ce sont les noms de mois dans la langue actuelle. Remplacez par LC_ALL=C locale monsi vous voulez les anglais quelle que soit la langue de l'utilisateur.

Avec zsh, vous pouvez également utiliser le $langinfotableau associatif spécial (dans le zsh/langinfomodule):

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

Bien que

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

serait plus court. Dans rc/ esqui sont d'autres shells avec des opérateurs de fractionnement où vous pouvez spécifier les séparateurs (autrement que via ce $IFSparamètre global comme dans les shells de type Bourne):

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

Modification du script de heemayl

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

Sans boucle

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

Vous pouvez utiliser une construction en boucle avec GNU datequi prend +1 month, +2 monthscomme des entrées:

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

Exemple:

$ 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
la source
3
Réglez i sur 5 au début pour commencer à partir de janvier.
123
2
@ 123 Dites-le encore 22 jours;)
heemayl
4

Python connaît tous les noms des mois:

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

Ou, nous pouvons utiliser python directement pour créer le répertoire:

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

Le cœur de ce qui précède est celui [os.mkdir(m) for m in calendar.month_name if m]qui fait un annuaire pour chaque mois en calendar.month_name. Cela générera un message d'erreur et se fermera si l'un des répertoires existe déjà. Si nous voulons éviter cela, nous pouvons tester l'existence des répertoires avant d'appeler mkdir:

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

Exemple:

$ 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

Internationalisation

Stéphane Chazelas souligne que ce qui précède imprime les noms des mois anglais. Pour obtenir les noms des mois locaux, il suggère:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'
John1024
la source
@ StéphaneChazelas Merci. J'ai mis à jour la réponse. (Votre locale monest supérieur et a déjà mon +1.)
John1024
2

Utiliser des locales et supposer Linux (la sortie de locale(1)est différente sur les autres systèmes) et bash(1):

#! /bin/sh
(
    eval "$( locale -k -c LC_TIME | grep ^mon= )" || exit
    IFS=\; months=($mon)
    mkdir "${months[@]}"
)
Satō Katsura
la source
months=($mon)n'est pas une shsyntaxe. C'est ksh93ou la bashsyntaxe.
Stéphane Chazelas