Je manipule un grand nombre de fichiers XML dispersés dans une structure de répertoires imbriqués.
J'ai essayé ce qui suit :
$ find . -name "*.xml" -type f | xargs -- xmllint --format
Le problème est qu'il génère la sortie XML formatée à l'écran, mais ne modifie pas le fichier.
Comment puis-je modifier cette commande afin que le contenu réel du fichier soit modifié ?
Réponse acceptée :
Cela peut être fait à partir de find
directement en utilisant -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Ce qui est passé à -exec
sera invoqué une fois par fichier trouvé avec les paramètres de modèle {}
remplacé par le nom de fichier actuel. Le \;
à la fin de la commande find termine juste la ligne.
L'utilisation de xargs
n'est pas vraiment nécessaire dans ce cas car nous devons invoquer xmllint
une fois par fichier car les noms des fichiers d'entrée et de sortie doivent être spécifiés dans le même appel.
xargs
serait nécessaire si la commande dirigée vers la recherche fonctionnait sur plusieurs fichiers à la fois et que cette liste était longue. Vous ne pouvez pas le faire dans ce cas, car vous devez transmettre le nom de fichier unique à --output
option de xmllint
. Sans xargs
vous pourriez vous retrouver avec une erreur "Liste d'arguments trop longue" si vous traitez beaucoup de fichiers. xargs
prend également en charge les chaînes de remplacement de fichiers avec le -I
choix :
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Ferait la même chose que le find -exec
commande ci-dessus. Si l'un de vos dossiers contient des caractères impairs dans des espaces similaires, vous devrez utiliser le -0
options de find
et xargs
. Mais en utilisant xargs
avec -I
implique l'option -L 1
ce qui signifie ne traiter qu'un seul fichier à la fois de toute façon, vous pouvez donc aussi bien utiliser directement find
avec -exec
.