kzen.dev
  • Questions
  • Tags
  • Utilisateurs
Notifications
Récompenses
Inscription
Une fois inscrit, vous serez informé des réponses et des commentaires à vos questions.
Connectez-vous
Si vous avez déjà un compte, connectez-vous pour vérifier les nouvelles notifications.
Il y aura des récompenses pour les questions, réponses et commentaires ajoutés.
Détails
Source
Editer
 themaestro
themaestro
Question

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
254 2012-05-09T20:12:42+00:00 3
 codeforester
codeforester
Question modifiée 15 juillet 2019 в 10:12
Programmation
scripting
bash
Cette question a 1 réponse en anglais, pour les lire connectez-vous à votre compte.
Solution / Réponse
Andrew Logvinov
Andrew Logvinov
9 mai 2012 в 8:18
2012-05-09T20:18:24+00:00
Détails
Source
Editer
#16148262

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
Wayne Werner
Wayne Werner
Réponse modifiée 24 novembre 2015 в 1:28
377
0
Jim Lewis
Jim Lewis
9 mai 2012 в 8:17
2012-05-09T20:17:40+00:00
Détails
Source
Editer
#16148261

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.

Carles Alcolea
Carles Alcolea
Réponse modifiée 18 août 2017 в 11:26
159
0
 tuxdna
tuxdna
25 décembre 2013 в 8:13
2013-12-25T08:13:17+00:00
Détails
Source
Editer
#16148263

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

1
0
Ajouter une question
Catégories
Toutes
Technologie
Culture / Loisirs
Vie / Arts
Science
Professionnel
Entreprises
Utilisateurs
Tous
Nouveau
Populaire
1
Ilya Smirnov
Enregistré il y a 2 jours
2
Денис Васьков
Enregistré il y a 4 jours
3
Dima Patrushev
Enregistré il y a 6 jours
4
sirojidddin otaboyev
Enregistré il y a 2 semaines
5
Елена Гайдамамакинат
Enregistré il y a 2 semaines
DE
ES
FR
ID
IT
JA
KO
NL
PT
RO
RU
TR
ZH
© kzen.dev 2023
Source
stackoverflow.com
sous licence cc by-sa 3.0 avec l'attribution