Bash 1 liner: Como criar um diretório para cada hora, de 00 a 23?

3

Um processo será escrito em um conjunto de diretórios, um para cada hora usando a data +% H notação, então 00, 01, 02 ... 22, 23. Eu estou querendo manter o 0 líder em um dígito horas para manter as listagens classificadas arrumadas.

I = 00; até [$ I a 23]; faça mkdir $ I; seja I = 1 + 1; feito

Tem efeitos previsíveis de não manter um 0 à esquerda antes dos dígitos únicos. Eu poderia apenas ir e fazer à mão, mas sinto que deveria haver uma maneira de fazer isso. Alguma idéia?

    
por Runc 11.11.2009 / 16:22

4 respostas

12
mkdir $(seq -w 00 23)
    
por 11.11.2009 / 16:58
13
mkdir {0{0..9},{10..23}}

Ou no Bash 4:

 mkdir {00..23}
    
por 11.11.2009 / 17:06
6
for i in 'seq -w 00 23';do mkdir $i;done
    
por 11.11.2009 / 16:25
3

Aqui está uma resposta completamente portátil (para qualquer shell derivado de Bourne em praticamente qualquer sistema que possa executar um desses), enquanto todas as outras respostas são pelo menos um pouco não-portáveis, dependem de construções de shell não portáteis ou seq , que é comum, mas nem em POSIX nem universal:

# start with a blank/clean "dirs" variable
dirs=
# iterate over the first digit
for i in 0 1 2
do
    # ..and the second digit for each first digit
    for j in 0 1 2 3 4 5 6 7 8 9
    do
        # add each digit combination to the dirs list
        dirs=$dirs\ $i$j
        # ..until we reach 23 - then we're done.
        case $i$j in 23) break 2; esac
    done
done
# finally make the directories
mkdir $dirs

Algumas notas:

A criação de dirs garante inicialmente que não usamos acidentalmente o valor de uma variável de ambiente chamada dirs , caso herdemos uma.

Poderíamos ignorar a construção da variável $dirs e apenas chamar mkdir $i$j . Mas desta forma executa melhor (um processo mkdir lançado em vez de 24) e é tão portável (se por acaso há realmente um sistema lá fora, mkdir só pode ter um argumento de diretório *, é fácil se adaptar para chamar mkdir para cada combinação de $i$j em vez de construir uma variável $dirs ).

A falta de citar em todo lugar é intencional e correta. As substituições não precisam ser citadas dentro de atribuições de variáveis e na primeira parte da instrução case : elas não passam por divisão de campo nesses pontos. E na linha mkdir no final, estamos contando com a divisão do campo para separar a lista de diretórios em nomes / argumentos separados para mkdir .

* "Oficialmente" MS-DOS e Windows tem um mkdir que leva apenas um nome de diretório, mas pelo menos no Windows 7 ele trabalha com vários nomes de diretório, além de qualquer porta de um shell parecido com o Bourne para os sistemas que Eu sei que vem com o seu próprio mkdir , e apenas esquisitos como eu pensariam sobre esse nível de portabilidade.

    
por 14.03.2016 / 07:14