2010-01-31 4 views
3

J'écris un programme simple pour exécuter un tas de fichiers dans divers répertoires de mon système. Cela implique essentiellement de les ouvrir et de vérifier la validité du XML. Une des options de ce programme est de lister les mauvais fichiers xml.Meilleur format de sortie pour Xargs

Cela m'amène à ma question. Quelle est la meilleure sortie pour formater ceci pour une utilisation avec XARGS. Je pensais que mettre chaque entrée sur une nouvelle ligne serait assez bon, mais cela semble un peu confus. parce que les noms de fichiers ont tous des espaces.

dire donc ma sortie est:

./dir name 1/file 1.xml 
./dir name 2/file 2.xml 
./dir name 3/file 3.xml 

J'ai essayé la commande suivante, mais il continue à dire « Aucun fichier ou répertoire ».

./myprogram.py --list BADXML | xargs -d '\n' cat 

donc .. Je suis soit mal compris comment utiliser xargs ou je dois changer légèrement le format de la sortie de mon programme. Je ne suis pas sûr le meilleur moyen d'utiliser) itinéraire à prendre ici. Je détesterais devoir toujours taper un désordre d'options xarg si je peux l'éviter.

+0

'touch space \ dir; echo hello> espace \ dir/espace \ fichier; echo "espace dir/espace fichier" | xargs -d '\ n' cat' fonctionne pour moi –

Répondre

2

man xargs

--null

-0 éléments d'entrée sont terminés par un caractère nul au lieu d' des espaces, et les citations et ne sont pas backslash spéciale (chaque personnage est pris littéralement ). Désactive la fin de la chaîne de fichier, laquelle est traitée comme n'importe quel autre argument. Utile lorsque les éléments d'entrée contiennent espace blanc, guillemets ou barres obliques inverses. L'option GNU find -print0 produit une entrée appropriée pour ce mode.

+0

Cela ne fonctionne pas non plus .. Eh bien, je suppose que je pourrais annuler ma sortie. Cela ne fait pas une très jolie liste si je n'utilise pas xargs. – PKKid

+2

Ajoutez une option '-0' à votre programme. './myprogram.py -0 --list BADXML | xargs -0 cat' –

+0

Je suis très proche. J'ai ajouté une option -0 qui affichera "\ 0" .join (listItems) via python. J'exécute la commande "./myprogram.py -0 --list BADXML | xargs -0 ls -l".Tout fonctionne à l'exception du tout dernier élément qui indique "Aucun fichier ou répertoire". Si je change la ligne out python en "\ 0" .join (listItems) + "\ 0" pour obtenir ce dernier élément, cela fonctionne pour le dernier élément, mais je reçois toujours un tel fichier ou un tel répertoire "" (ligne blanche). – PKKid

1

Vous pouvez fossé xargs et utiliser lire:

 
./myprogram.py --list BADXML | while read -a line; do cat "${line[*]}"; done 

xargs Anything peuvent faire, des boucles en lire peuvent faire mieux ...

Postscript Par ma When should xargs be preferred over while-read-loops question, la les réponses ont souligné un cas d'efficacité très fort pour xargs, bien qu'il ne soit pas trop difficile de simuler l'argumentation de xargs avec des scripts supplémentaires, par ex.

batch10cat() { 
    local i=1 argv line 
    declare -a argv 
    while read -r line; do 
     argv[i]="$line" 
     let i++ 
     if test $i -gt 10; then i=1; cat "${argv[@]}"; fi 
    done 
    if test $i -gt 1; then cat "${argv[@]}"; fi 
} 
./myprogram.py --list BADXML | batch10 cat 
0

Avec GNU Parallel http://www.gnu.org/software/parallel/ vous devriez être en mesure de le faire sans changement myprogram.py:

./myprogram.py --list BADXML | parallel cat 

En bonus: le chat se déroulera en parallèle et peut donc être plus rapide sur les ordinateurs multi-cœurs .