Je voudrais créer de nombreux répertoires en utilisant mkdir
. Chaque nom de répertoire sera composé d'un préfixe (une chaîne) et d'un index (un entier). Supposons que je souhaite que le préfixe soit "s" et que les indices soient compris entre 1 et 50. Cela signifie que je voudrais créer des répertoires intitulés:
s1
,, s2
... s49
,,s50
Existe-t-il un moyen de le faire automatiquement en utilisant mkdir
? Merci pour votre temps.
bash
. Merci pour votre temps!s01
,s02
, ...,s49
,s50
. Si j'ai utilisé des indices à largeur fixe,/bin/ls
produit presque toujours l'ordre que je veux.Réponses:
Vous pouvez le faire avec un script shell.
Pure sh - cela fonctionnera même sur les coques bourne pré-POSIX:
Si vous souhaitez créer un grand nombre de répertoires, vous pouvez rendre le script plus rapide en le réduisant à un seul appel
mkdir
ou en utilisant des commandes internes de shell pour les tests et l'arithmétique. Comme ça:Zsh, ksh93 ou bash rendent cela beaucoup plus facile, mais je dois souligner que cela n'est pas intégré
mkdir
et peut ne pas fonctionner dans d'autres shells. Pour les cas plus importants, il peut également être affecté par des limites sur le nombre ou la taille totale des arguments qui peuvent être passés à une commande.la source
n=$(( n + 1 ))
aurait été tout aussi strictement POSIX et ne vous coûterait pas un sous-shell.[[
mot-clé n'est pas POSIX. (Sans oublier qu'il[
s'agit d' un obus intégré à de nombreux obus modernes.)[[
fonctionne sur monksh88
(qui est antérieurbash
) donc j'ai supposé que c'était POSIX. Je n'ai trouvé aucune mention de cela dans la spécification POSIX, donc je pense que vous avez raison. Merci pour l'info!for i in {range}
pour les utilisateurs de shells avancés.Un
Deux
Cette option fonctionne en bash , zsh et ksh93
Trois
la source
$i
que simplement créer un répertoire, par exemplemkdir s$i ; echo $i > s$i/$i
. De plus, One est un bel exemple simple d'utilisation d'une boucle for dans bash ... sur un site comme celui-ci, il n'est pas du tout improbable pour un utilisateur novice de le voir et de penser "bien, je ne savais pas que vous pouviez faire ça "---> l'illumination.Beaucoup de réponses compliquées ici, mais bash le rend vraiment facile. Bien sûr, la solution POSIX pure fonctionne, mais pourquoi ne pas profiter du
bash
shell que vous utilisez, de toute façon? Vous pouvez le faire facilement avec l' extension d'accolade :la source
mkdir $(seq --format 's%.0f' 1 50)
ou si vous voulez des nombres remplis par zéro (ce qui serait mieux pour le tri):
mkdir $(seq --format 's%02.0f' 1 50)
ou:
mkdir s$(seq -s ' s' -w 1 50)
- notez la chaîne 's' juste avant le$()
, sans elle le premier répertoire créé sera juste '01' plutôt que 's01'et enfin:
mkdir $(printf "s%02i " $(seq 1 50))
seq
est de GNU Coreutilsbizarrement, seq
--format
ou-f
option n'autorise que les doubles types à virgule flottante de printf (comme f et g. également un étrange format hexadécimal à virgule flottante pour lequel je n'ai jamais trouvé d'utilisation). Je ne sais pas pourquoi. Ce serait bien s'il supportait également d'autresprintf(3)
types numériques comme entier (d, i), octal (o, U) ou hex (x, X).Quoi qu'il en soit, un format double avec une précision décimale 0 comme
%.0f
ou%02.0f
est assez proche d'un entier à cet effet.Voir également: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
la source
{1,50}
ou{01,50}
(pour le remplissage nul) est beaucoup plus facile et plus compréhensible.Juste pour être différent, voici une solution POSIX sh qui utilise la récursivité:
la source