Como faço para criar vários diretórios ao mesmo tempo em um diretório?

25

Eu sei com mkdir que posso fazer mkdir A B C D E Fpara criar cada diretório. Como crio os diretórios AZ ou 1-100 sem digitar cada letra ou número?

Steve Burdine
fonte

Respostas:

18

Provavelmente é mais fácil usar apenas um forloop:

for char in {A..Z}; do
    mkdir $char
done

for num in {1..100}; do
    mkdir $num
done

Você precisa pelo menos do bash 3.0; caso contrário, você tem que usar algo comoseq

Michael Mrozek
fonte
11
Michael obrigado! curioso, eu também tentei adicionar testes na frente de $ char para char em {A..Z}; do mkdir test $ char feito, o que me deu o teste de diretórios [AZ], sempre bom para aprender #
Steve Burdine
Uma coisa a ter em mente é como os nomes dos arquivos serão classificados quando você os listar ou usar com caracteres curinga como *. '11' será classificado antes de '2'. Isso pode ser evitado se você organizar todos os números com o mesmo comprimento com zeros à esquerda. Dennis Williams mostra como fazer isso no bash 4, mas você pode codificar seu script para fazê-lo, se você não tiver o bash 4. #
1111 Joe Joe
71

A {}sintaxe é a sintaxe do bash não vinculada à forconstrução.

mkdir {A..Z}

é suficiente por si só.

http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion

rcrowley
fonte
5
Oh, isso é espetacular. Esta é uma resposta muito melhor
Michael Mrozek
11
Eu não sabia disso, ótima dica!
Invert
5
+1 para a beleza, um para o estilo, +1 para rcrowley
Stefan
+500 recompensa de mim.
George Chalhoub
Isso é incrível! apenas usei:mkdir -p ./logs-{1..5}
Pranav # 17/0116
8

Você também pode fazer combinações mais complexas (tente estas com, em echovez de mkdirnão haver limpeza depois):

Comparar

$ echo pre-{{F..G},{3..4},{m..n}}-post
pre-F-post pre-G-post pre-3-post pre-4-post pre-m-post pre-n-post

para

$ echo pre-{F..G}{3..4}{m..n}-post
pre-F3m-post pre-F3n-post pre-F4m-post pre-F4n-post pre-G3m-post pre-G3n-post
pre-G4m-post pre-G4n-post

Se você tem o Bash 4, tente

$ echo file{0001..10}
file0001 file0002 file0003 file0004 file0005 file0006 file0007 file0008 file0009
file0010

e

$ echo file{0001..10..2}
file0001 file0003 file0005 file0007 file0009
Pausado até novo aviso.
fonte
7

No Linux, você pode gerar sequências de dígitos com o comando "seq", mas isso não existe em todos os sistemas Unix. Por exemplo, para gerar diretórios de 1 a 100:

mkdir `seq 1 100`

Embora você possa criar diretórios de A a Z com os utilitários de shell:

seq 65 90 \
    | while read foo; do printf "%b\n" `printf '\\\\x%x\n' $foo`; done \
    | xargs mkdir

Provavelmente é muito menos feio usar o Perl:

perl -e 'foreach (ord "A"..ord "Z") { mkdir chr $_ }'
dhd
fonte
-1

mkdir direct{1..3}resultará mkdir direct1 direct2 direct3e assim por diante. O mesmo para{a..z}

Lionel AVOGNON
fonte
2
esta é uma reiteração de três respostas existentes e a que eu já comentei
Jeff Schaller
-2

mkdir {A..Z} mkdir {0..100} mkdir test_ {A..Z} e assim por diante.

Avognon Lionel
fonte
Eu não entendi
Pierre.Vriens
11
isso já foi coberto
Jeff Schaller