web-dev-qa-db-fra.com

pour une boucle sur des fichiers spécifiques dans un répertoire à l'aide de Bash

Dans un répertoire, vous avez plusieurs fichiers - .txt, .sh puis planifier les fichiers sans .foo modificateur.

Si vous ls le répertoire:

blah.txt
blah.sh
blah
blahs

Comment dire à une boucle for de n'utiliser que des fichiers sans .foo modifier? Donc, "faites des trucs" sur les fichiers blah et blahs dans l'exemple ci-dessus.

La syntaxe de base est:

#!/bin/bash
FILES=/home/shep/Desktop/test/*

for f in $FILES
do
    XYZ functions
done

Comme vous pouvez le voir, cela boucle efficacement sur tout dans le répertoire. Comment exclure le .sh, .txt ou tout autre modificateur?

J'ai joué avec certaines instructions if, mais je suis vraiment curieux de pouvoir sélectionner ces fichiers non modifiés.

Quelqu'un pourrait-il également me dire le jargon approprié pour ces fichiers de texte brut sans .txt?

24
jon_shep
#!/bin/bash
FILES=/home/shep/Desktop/test/*

for f in $FILES
do
if [[ "$f" != *\.* ]]
then
  DO STUFF
fi
done
32
David Kiger

Si vous le voulez un peu plus complexe, vous pouvez utiliser la commande find-command.

Pour le répertoire actuel:

for i in `find . -type f -regex \.\\/[A-Za-z0-9]*`
do
WHAT U WANT DONE
done

explication:

find . -> starts find in the current dir
-type f -> find only files
-regex -> use a regular expression
\.\\/[A-Za-z0-9]* -> thats the expression, this matches all files which starts with ./
(because we start in the current dir all files starts with this) and has only chars
and numbers in the filename.

http://infofreund.de/bash-loop-through-files/

12
chris2k

Vous pouvez utiliser des caractères génériques négatifs? pour les filtrer:

$ ls -1
a.txt
b.txt
c.png
d.py
$ ls -1 !(*.txt)
c.png
d.py
$ ls -1 !(*.txt|*.py)
c.png
1
Blender