Créer un répertoire nommé 0001 au lieu de 1 dans une boucle de script bash

10

Dans le script bash suivant si j = 0000, comment dois-je changer le script bash suivant pour créer des répertoires nommés 0001, 0002, ...? En fait, il crée des répertoires nommés 1, 2, 3

for i in *.jpg; do let j+=1 ; mkdir $j ; done

Merci!

Marcello
la source

Réponses:

13

Votre script actuel utilise uniquement une valeur décimale - cela se traduit évidemment par la valeur sans zéros non significatifs.

Vous devez remplir la chaîne à la longueur de 4 caractères, avec des zéros en tête. Pour ce faire, utilisez des astuces ``pour obtenir le résultat de l'appel printf printf %04d $j.

Par conséquent, vous devriez avoir la commande complète:

for i in *.jpg; do let j+=1; mkdir `printf %04d $j`; done

Source: StackOverflow: bash - Remplissage des zéros dans une chaîne

(Évidemment, voir également les réponses supplémentaires à cette question, si vous voulez une solution plus approfondie, mais cela fonctionne certainement parfaitement pour ce cas d'utilisation.)

user98085
la source
5

En utilisant bash, votre meilleure option est:

mkdir {0001..0666}

pour créer des répertoires avec un nom 0001pour 0666(avec un remplissage nul).

Si vous voulez des répertoires nommés prefix0001suffix, prefix0002suffix... puis:

mkdir prefix{0001..0666}suffix

ça ira.

Si vous souhaitez uniquement des noms de répertoire de numéros impairs

mkdir {0001..0666..2}

et ainsi de suite ... Voir Extension d'accolade dans le bashmanuel de référence .

Comme le souligne FEichinger, vous devez connaître à l'avance le nombre de répertoires. Si vous voulez une solution proche de la vôtre, mais vraiment sûre et utilisant un idiome bash plus moderne:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done
gniourf_gniourf
la source
Ceci n'est utile que pour une quantité de répertoires précédemment connue à créer. Habituellement, lorsque vous utilisez des répertoires numérotés, vous êtes dans un contexte dynamique - ce qui signifie qu'il doit déterminer la quantité au moment de l'exécution et a donc toujours besoin d'un remplissage de chaîne. Cela dépend du cas d'utilisation spécifique.
user98085
@FEichinger Droite! poste modifié en conséquence.
gniourf_gniourf