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


8

Postando perguntas por curiosidade, eu queria criar um diretório como janeiro, fevereiro ... a dezembro, então criei-os dando o nome individualmente. ( 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 esta existe outra solução para criar os arquivos ou diretório com o nome do mês?

Respostas:


18

POSIXly,

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

Observe que são os nomes dos meses no idioma atual. Substitua por LC_ALL=C locale monse desejar os ingleses, independentemente do idioma do usuário.

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

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

Apesar

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

seria mais curto. Em rc/ esque existem outros shells com operadores de divisão nos quais é possível especificar os separadores (exceto através dessa $IFSconfiguração global , como nos shells Bourne):

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

9

Modificação do script de heemayl

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

Sem laço

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

8

Você pode usar uma construção de loop com o GNU dateque aceita +1 month, +2 monthscomo 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

3
Defina i como 5 no início, a partir de janeiro.
123

2
@ 123 dizê-lo novamente 22 dias;)
heemayl

4

Python conhece todos os nomes dos meses:

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

Ou, podemos usar 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 do exposto acima é o [os.mkdir(m) for m in calendar.month_name if m]que cria um diretório para todos os meses em calendar.month_name. Isso irá gerar uma mensagem de erro e sair se algum dos diretórios já existir. Se quisermos evitar isso, podemos testar a existência de 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 imprime nomes de meses em inglês. 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]'

@ StéphaneChazelas Obrigado. Eu atualizei a resposta. (O seu locale moné superior e já tem a minha +1.)
John1024

2

Usando localidades e assumindo 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[@]}"
)

months=($mon)não é shsintaxe. Isso é ksh93ou bashsintaxe.
Stéphane Chazelas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.