Exécuter la commande sur tous les fichiers d'un répertoire

Quelqu'un pourrait-il fournir le code permettant de faire ce qui suit ? Supposons qu'il existe un répertoire de fichiers, qui doivent tous être exécutés par un programme. Le programme envoie les résultats à la sortie standard. J'ai besoin d'un script qui aille dans un répertoire, exécute la commande sur chaque fichier et concatène les résultats dans un grand fichier de sortie.

Par exemple, pour exécuter la commande sur un fichier :

$ cmd [option] [filename] > results.out
Solution

Le code bash suivant passera $file à la commande où $file représentera chaque fichier dans /dir.

for file in /dir/*
do
  cmd [option] "$file" >> results.out
done

Exemple

el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Commentaires (8)

Que dites-vous de ça ?

find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out
  • L'argument -maxdepth 1 empêche find de descendre de façon récursive dans les dans les sous-répertoires. (Si vous voulez que de tels répertoires imbriqués soient traités, vous pouvez l'omettre).
  • -type -f spécifie que seuls les fichiers simples seront traités.
  • -exec cmd option {} lui indique d'exécuter cmd avec l'option spécifiée pour chaque fichier trouvé, le nom de fichier étant substitué à {}.
  • ; indique la fin de la commande.
  • Enfin, la sortie de toutes les exécutions individuelles de cmd est redirigée vers results.out

Cependant, si vous vous souciez de l'ordre dans lequel les fichiers sont traités, vous vous feriez mieux d'écrire une boucle. Je pense que find traite les fichiers fichiers dans l'ordre des inodes (mais je peux me tromper), ce qui n'est peut-être pas ce que vous voulez.

Commentaires (5)

Basé sur l'approche de @Jim Lewis's :

Voici une solution rapide utilisant find et aussi le tri des fichiers par leur date de modification :

$ find  directory/ -maxdepth 1 -type f -print0 | \
  xargs -r0 stat -c "%y %n" | \
  sort | cut -d' ' -f4- | \
  xargs -d "\n" -I{} cmd -op1 {} 

Pour le tri, voir :

http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time

Commentaires (3)