web-dev-qa-db-fra.com

Exécuter un Bash en boucle sur tous les fichiers similaires

Je voudrais écrire une boucle while dans Bash qui s’applique à toutes les instances de fichiers de la forme suivante:

{number}.tst

par exemple, 1.tst, 2.tst, ... 50.tst.

Je fais pas je veux que ça tourne sur le fichier tst.tst.

Comment pourrais-je m'y prendre pour écrire cela? Je suppose que j'aurai besoin d'une phrase booléenne et de [0-9]* quelque part, mais je ne suis pas tout à fait sûr de la syntaxe.

5
J. Doe

Si vous ne devez exclure que les noms alphabétiques tels que votre exemple tst.tst, vous pouvez utiliser un simple shell glob

for f in [0-9]*.tst; do echo "$f"; done

Avec bash extended globs (qui devrait être activé par défaut dans Ubuntu)

donné

$ ls *.tst
1.tst  2.tst  3.tst  4.tst  50.tst  5.tst  bar.tst  foo.tst

alors +([0-9]) signifie un ou plusieurs chiffres décimaux:

for f in +([0-9]).tst; do echo "$f"; done
1.tst
2.tst
3.tst
4.tst
50.tst
5.tst

Vous pouvez vérifier si le mode de déplacement étendu est activé à l'aide de shopt extglob et le définir si nécessaire à l'aide de shopt -s extglob (et non défini à l'aide de set -u extglob).

8
steeldriver

À partir de ce débordement de pile , répondez: Répertoriez les fichiers dont le nom ne contient qu'un numéro :

find . -regex '.*/[0-9]+\.tst'

OU

L'utilisation de find présente également des avantages lorsque vous souhaitez utiliser les fichiers, par exemple. en utilisant les -exec, -print0 intégrés et dirigez-les vers xargs -0 ou même (avec Bash):

while IFS='' read -r -d '' file
do
  # ...
done < <(find . -regex '.*/[0-9]+\.tst' -print0)

Notez les autres réponses ici mes fichiers d'inclusion qui ne sont pas des nombres si le nom du fichier commence par un chiffre. La réponse affichée ici ne le fait cependant pas. Par exemple:

$ ls *.tst
12tst.tst  1.tst  2.tst

$ find . -maxdepth 1 -regex '.*/[0-9]+\.tst'
./1.tst
./2.tst

REMARQUE: Utilisez l'argument -maxdepth 1 pour répertorier uniquement les fichiers numérotés dans le répertoire actuel et non dans les sous-répertoires.

6
WinEunuuchs2Unix

Dans ce cas, il n'y a pas de noms de fichier de la forme {numéro} {non-nombre} .tst, une solution possible consiste donc à inclure tous les noms de fichiers qui début avec un numéro:

for filename in [0-9]*.tst; do
    echo "$filename"  # Example command
done
4
wjandrea

Si vous souhaitez traiter les fichiers dans l'ordre numérique, utilisez la commande seq(read man seq).

for i in $( seq 1 50 ) ; do
    echo "Process ${i}.txt"
done
0
waltinator