Eu gostaria de criar muitos diretórios usando mkdir
. Cada nome de diretório consistirá em um prefixo (uma sequência) e um índice (um número inteiro). Suponha que eu gostaria que o prefixo fosse "s" e os índices variassem de 1 a 50. Isso significa que eu gostaria de criar diretórios intitulados:
s1
,, s2
... s49
,,s50
Existe uma maneira de fazer isso automaticamente usando mkdir
? Obrigado pelo seu tempo.
bash
. Obrigado pelo seu tempo!s01
,s02
, ...,s49
,s50
. Se eu usei índices de largura fixa,/bin/ls
quase sempre produz a ordem que desejo.Respostas:
Você pode fazer isso com um script de shell.
Sh puro - isso funcionará mesmo em cascas de bourne pré-POSIX:
Se você deseja criar um número alto de diretórios, pode tornar o script mais rápido, reduzindo-o a uma única chamada
mkdir
e usando os recursos internos do shell para testes e aritmética. Como isso:Zsh, ksh93 ou bash tornam isso muito mais fácil, mas devo ressaltar que isso não está embutido
mkdir
e pode não funcionar em outros shells. Para casos maiores, também pode ser afetado por limites no número ou tamanho total de argumentos que podem ser passados para um comando.fonte
n=$(( n + 1 ))
teria sido tão estritamente POSIX e não lhe custaria um subshell.[[
palavra-chave não é POSIX. (Para não mencionar que[
é um builtin shell em muitos shells modernos.)[[
funciona no meuksh88
(que é anteriorbash
), então eu assumi que era POSIX. Não encontrei nenhuma menção a isso na especificação POSIX, portanto acredito que você está certo. Obrigado pela informação!for i in {range}
para os usuários de shells avançados.1
Dois
Esta opção funciona no bash , zsh e ksh93
Três
fonte
$i
que apenas criar um diretório, por exemplomkdir s$i ; echo $i > s$i/$i
. Além disso, One é um exemplo simples e agradável de usar um loop for no bash ... em um site como este, não é improvável que um usuário iniciante o veja e pense "bom, eu não sabia que você poderia fazer isso" "---> iluminação.Muitas respostas complicadas aqui, mas o bash facilita muito. Claro, a solução POSIX pura funciona, mas por que não tirar proveito do
bash
shell que você está usando? Você pode fazer isso facilmente com a expansão de chaves :fonte
mkdir $(seq --format 's%.0f' 1 50)
ou se você quiser números preenchidos com zero (o que seria melhor para a classificação):
mkdir $(seq --format 's%02.0f' 1 50)
ou:
mkdir s$(seq -s ' s' -w 1 50)
- observe a string 's' logo antes de$()
, sem ela o primeiro diretório criado será apenas '01' em vez de 's01'e finalmente:
mkdir $(printf "s%02i " $(seq 1 50))
seq
é do GNU Coreutilsestranhamente, seq's
--format
ou-f
option apenas permitem tipos duplos de ponto flutuante do printf (como f e g. também um formato hexadecimal de ponto flutuante estranho que eu nunca encontrei utilidade). Eu não tenho ideia do porquê. Seria bom se ele também suportasse outrosprintf(3)
tipos numéricos como número inteiro (d, i), octal (o, U) ou hex (x, X).De qualquer forma, um formato duplo com precisão decimal 0 como
%.0f
ou%02.0f
é próximo o suficiente de um número inteiro para essa finalidade.Veja também: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
fonte
{1,50}
ou{01,50}
(para preenchimento zero) é muito mais fácil e compreensível.Apenas para ser diferente, aqui está uma solução POSIX sh que usa recursão:
fonte