criando o diretório apenas com o nome do mês

8

Postando uma pergunta por curiosidade, Eu queria criar um diretório como janeiro, fevereiro ... para dezembro, então eu os criei individualmente, dando o nome. ( mkdir January February .... etc) É possível criar diretórios ou nomes de arquivos com o nome de todos os meses de maneira fácil?

por exemplo: touch {1..10} criará 10 arquivos 1,2,3 ... 10 facilmente, como se houvesse alguma outra solução para criar os arquivos ou diretório com o nome do mês?

    
por karthik 09.08.2016 / 09:18

5 respostas

18

POSIXly,

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

Note que são os nomes dos meses no idioma atual. Substitua por LC_ALL=C locale mon se você quiser os ingleses, independentemente do idioma do usuário.

Com zsh , você também pode usar a matriz associativa especial $langinfo (no módulo zsh/langinfo ):

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

Embora

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

seria mais curto. Em rc / es , que são outras shells com operadores de divisão, onde você pode especificar os separadores (diferente da configuração global $IFS , como em shells semelhantes a Bourne):

mkdir -- ''';'{locale mon}
    
por 09.08.2016 / 10:28
9

Modificação do script do heemayl

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

Sem loop

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

Você pode usar uma construção de loop com o GNU date , que recebe +1 month , +2 months como entradas:

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

Exemplo:

$ 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
    
por 09.08.2016 / 09:26
4

Python conhece todos os nomes dos meses:

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

Ou, podemos usar o python diretamente para criar o diretório:

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

O coração dos itens acima é [os.mkdir(m) for m in calendar.month_name if m] , que cria um diretório para cada mês em calendar.month_name . Isso gerará uma mensagem de erro e será encerrado se algum dos diretórios já existir. Se quisermos evitar isso, podemos testar a existência dos diretórios antes de chamar mkdir :

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

Exemplo:

$ 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

Internacionalização

Stéphane Chazelas ressalta que o texto acima menciona os nomes dos meses ingleses. Para obter nomes de meses locais, ele sugere:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'
    
por 09.08.2016 / 09:34
2

Usando locales e assumindo o Linux (a saída de locale(1) é diferente em outros sistemas) e bash(1) :

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