Criando vários diretórios usando o mkdir

12

Eu gostaria de criar muitos diretórios usando mkdir . Cada nome de diretório consistirá em um prefixo (uma string) e um índice (um inteiro). Suponha que eu queira que o prefixo seja "s" e os índices variem 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.

    
por Andrew 21.09.2012 / 00:20

5 respostas

29

Você pode fazer isso com um script de shell.

Pure sh - isso funcionará mesmo em cartuchos pré-POSIX bourne:

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n='expr "$n" + 1';
done

Se você deseja criar um grande número de diretórios, você pode tornar o script mais rápido, reduzindo-o a uma única chamada de mkdir , bem como usando built-in de shell para testes e aritmética. Assim:

n=1
max=50
set -- # this sets $@ [the argv array] to an empty list.

while [ "$n" -le "$max" ]; do
    set -- "$@" "s$n" # this adds s$n to the end of $@
    n=$(( $n + 1 ));
done 

mkdir "$@"

Zsh, ksh93 ou bash tornam isso muito mais fácil, mas devo salientar que isso não está embutido em 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.

mkdir s{1..50}
    
por 21.09.2012 / 00:35
31
  • Um

    for i in {1..50}; do
      mkdir s"$i"
    done
    
  • Dois

    mkdir s{1..50}
    

    Esta opção funciona em bash , zsh e ksh93

  • Três

    mkdir $(printf "s%02i " $(seq 1 50))
    
por 21.09.2012 / 00:30
7

Muitas respostas complicadas aqui, mas o bash torna isso muito fácil. Claro, a solução POSIX pura funciona, mas por que não aproveitar o shell bash que você está usando? Você pode fazer isso facilmente com a expansão de chaves :

% mkdir -v s{1..10} && ls -1d s{1..10}                                   (09-24 17:37)
mkdir: created directory 's1'
mkdir: created directory 's2'
mkdir: created directory 's3'
mkdir: created directory 's4'
mkdir: created directory 's5'
mkdir: created directory 's6'
mkdir: created directory 's7'
mkdir: created directory 's8'
mkdir: created directory 's9'
mkdir: created directory 's10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9
    
por 25.09.2012 / 00:39
5

mkdir $(seq --format 's%.0f' 1 50)

ou se você quiser números zero-padded (o que seria melhor para classificar):

mkdir $(seq --format 's%02.0f' 1 50)

ou:

mkdir s$(seq -s ' s' -w 1 50) - observe a string 's' logo antes do $() , 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 Coreutils

Curiosamente, a opção --format ou -f do seq permite apenas os tipos double de ponto flutuante do printf (como f e g também um formato hexadecimal de ponto flutuante estranho para o qual eu nunca encontrei nenhum uso). Eu não tenho ideia do porquê. Seria bom se também suportasse outros tipos numéricos printf(3) como inteiro (d, i), octal (o, U) ou hex (x, X).

De qualquer forma, um formato duplo com precisão decimal de 0, como %.0f ou %02.0f , é próximo o suficiente de um inteiro para essa finalidade.

$ seq --help
Usage: seq [OPTION]... LAST
  or:  seq [OPTION]... FIRST LAST
  or:  seq [OPTION]... FIRST INCREMENT LAST
Print numbers from FIRST to LAST, in steps of INCREMENT.

  -f, --format=FORMAT      use printf style floating-point FORMAT
  -s, --separator=STRING   use STRING to separate numbers (default: \n)
  -w, --equal-width        equalize width by padding with leading zeroes
      --help     display this help and exit
      --version  output version information and exit

If FIRST or INCREMENT is omitted, it defaults to 1.  That is, an
omitted INCREMENT defaults to 1 even when LAST is smaller than FIRST.
FIRST, INCREMENT, and LAST are interpreted as floating point values.
INCREMENT is usually positive if FIRST is smaller than LAST, and
INCREMENT is usually negative if FIRST is greater than LAST.
FORMAT must be suitable for printing one argument of type 'double';
it defaults to %.PRECf if FIRST, INCREMENT, and LAST are all fixed point
decimal numbers with maximum precision PREC, and to %g otherwise.

Veja também: link

    
por 21.09.2012 / 01:53
4

Só para ser diferente, aqui está uma solução POSIX sh que usa recursão:

makedirs() {
  [ "$1" -gt 0 ] || return
  mkdir "s$1"
  makedirs $(( $1 - 1 ))
}
$ makedirs 9
$ ls
s1  s2  s3  s4  s5  s6  s7  s8  s9
    
por 21.09.2012 / 07:08