mkdir $(seq -w 00 23)
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?
mkdir {0{0..9},{10..23}}
Ou no Bash 4:
mkdir {00..23}
for i in 'seq -w 00 23';do mkdir $i;done
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.