Comment créer plusieurs répertoires à la fois dans un répertoire?

25

Je sais qu'avec mkdir je peux faire mkdir A B C D E Fpour créer chaque répertoire. Comment créer des répertoires AZ ou 1-100 sans taper chaque lettre ou chiffre?

Steve Burdine
la source

Réponses:

18

Il est probablement plus simple d'utiliser simplement une forboucle:

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

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

Vous avez cependant besoin d'au moins bash 3.0; sinon vous devez utiliser quelque chose commeseq

Michael Mrozek
la source
1
Merci Michael! étant curieux je l'ai aussi essayé en ajoutant test devant $ char pour char dans {A..Z}; do mkdir test $ char done qui m'a donné le test des répertoires [AZ], toujours bon à apprendre
Steve Burdine
Une chose à garder à l'esprit est la façon dont vos noms de fichiers seront triés lorsque vous les répertoriez ou les utilisez avec des caractères génériques comme *. '11' triera avant '2'. Cela peut être évité si vous faites en sorte que tous les nombres soient de la même longueur avec des zéros non significatifs. Dennis Williams montre comment faire cela dans bash 4, mais vous pouvez coder votre script pour le faire si vous n'avez pas bash 4.
Joe
71

La {}syntaxe est la syntaxe Bash non liée à la forconstruction.

mkdir {A..Z}

est suffisant en soi.

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

rcrowley
la source
5
Oh, c'est spectaculaire. C'est une bien meilleure réponse
Michael Mrozek
1
Je ne le savais pas, super astuce!
inverser
5
+1 pour la beauté, +1 pour le style, +1 pour rcrowley
Stefan
+500 primes de ma part.
George Chalhoub
C'est génial! vient de l'utiliser:mkdir -p ./logs-{1..5}
Pranav 웃
8

Vous pouvez également faire des combinaisons plus complexes (essayez-les avec echoau lieu de mkdirpour qu'il n'y ait pas de nettoyage par la suite):

Comparer

$ 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

à

$ 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

Si vous avez Bash 4, essayez

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

et

$ echo file{0001..10..2}
file0001 file0003 file0005 file0007 file0009
En pause jusqu'à nouvel ordre.
la source
7

Sous Linux, vous pouvez générer des séquences de chiffres avec la commande "seq", mais cela n'existe pas sur tous les systèmes Unix. Par exemple pour générer des répertoires de 1 à 100:

mkdir `seq 1 100`

Bien que vous puissiez certainement créer des répertoires de A à Z avec des utilitaires shell:

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

C'est probablement beaucoup moins moche d'utiliser simplement Perl:

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

mkdir direct{1..3}se traduira par mkdir direct1 direct2 direct3et ainsi de suite. Pareil pour{a..z}

Lionel AVOGNON
la source
2
il s'agit d'une réitération de trois réponses existantes et de celle que j'ai déjà commentée
Jeff Schaller
-2

mkdir {A..Z} mkdir {0..100} mkdir test_ {A..Z} et ainsi de suite.

Avognon Lionel
la source
Je ne comprends pas
Pierre.Vriens
1
cela a déjà été couvert
Jeff Schaller