creando la directory solo con il nome del mese


8

Pubblicando domande per curiosità, volevo creare una directory come da gennaio, febbraio ... a dicembre, quindi le ho create dando il nome individualmente. ( mkdir January February.... ecc.) È possibile creare directory o nomi di file con il nome di tutti i mesi in modo semplice?

per esempio: touch {1..10}creerà facilmente 10 file 1,2,3 ... 10, in questo modo esiste un'altra soluzione per creare i file o la directory con il nome del mese?

Risposte:


18

POSIXly,

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

Nota che sono i nomi dei mesi nella lingua corrente. Sostituisci con LC_ALL=C locale monse desideri quelli inglesi indipendentemente dalla lingua dell'utente.

Con zsh, puoi anche usare l' $langinfoarray associativo speciale (nel zsh/langinfomodulo):

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

Anche se

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

sarebbe più breve. In rc/ esche sono altre shell con operatori di divisione in cui è possibile specificare i separatori (diversi da quelli tramite quell'impostazione globale $IFScome nelle shell tipo Bourne):

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

9

Modifica della sceneggiatura di heemayl

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

Senza anello

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

8

Puoi usare un costrutto in loop con GNU dateche accetta +1 month, +2 monthscome input:

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

Esempio:

$ 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

3
Impostare i su 5 all'inizio per iniziare da gennaio.
123

2
@ 123 Dillo ancora 22 giorni;)
heemayl

4

Python conosce tutti i nomi dei mesi:

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

Oppure, possiamo usare Python direttamente per creare la directory:

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

Il cuore di quanto sopra è [os.mkdir(m) for m in calendar.month_name if m]che crea una directory per ogni mese in calendar.month_name. Ciò genererà un messaggio di errore e si chiuderà se esiste già una delle directory. Se vogliamo evitarlo, possiamo verificare l'esistenza delle directory prima di chiamare mkdir:

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

Esempio:

$ 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

Internazionalizzazione

Stéphane Chazelas sottolinea che quanto sopra stampa i nomi dei mesi inglesi. Per ottenere i nomi dei mesi locali, suggerisce:

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

@ StéphaneChazelas Grazie. Ho aggiornato la risposta. (Il tuo locale monè superiore e ha già il mio +1.)
Giovanni 1024

2

Usare le localizzazioni e assumere Linux (l'output di locale(1)è diverso su altri sistemi) e bash(1):

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

months=($mon)non è shsintassi. Questa è ksh93o bashsintassi.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.