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
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
[email protected] ~/foo $ touch foo.txt bar.txt baz.txt
[email protected] ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Que dites-vous de ça ?
find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out
-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.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.
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