En supposant un UNIX like environment:
Pour gérer les espaces dans les noms, utilisez l'indicateur -0
pour xargs. Avec trouvaille:
find . -name '*.mp3' -print0 | xargs -0 dosomething
D'autres commandes ont plusieurs commutateurs pour la sortie séparés NUL, généralement -0
ou -z
.Si votre liste est orientée vers la ligne, faire quelque chose comme:
cat filelist | tr -s '\012\015' '\000' | xargs -0 dosomething
qui utilise tr
pour traduire les nouvelles lignes et à linefeeds nuls, la manipulation UNIX et DOS (et même Mac Classic) ligne se termine et sauter des lignes vides. N'oubliez pas que les nouvelles lignes sont des caractères de nom de fichier valides sur la plupart des systèmes de fichiers de type UNIX.
Si dosomething
est complexe, vous pouvez utiliser les fonctions de bash:
dosomething() {
while [ -n "$1" ] ; do
out="$(basename "$1" .mp3).ogg"
convert "$1" "converted/$out"
shift
done
}
export -f dosomething
et invoquez xargs
comme:
cat filelist | tr -s '\012\015' '\000' | xargs -0 bash -c 'dosomething "[email protected]"' --
Notez l'utilisation judicieuse des guillemets doubles pour préserver des espaces, et double- Les chaînes entre guillemets peuvent être imbriquées dans les opérateurs eval $()
entre guillemets.
Au sein de la fonction, vous pouvez écrire "[email protected]"
pour obtenir une liste d'arguments correctement cité pour passer à un sous-processus:
dosomething() {
command1 preargs "[email protected]" postargs | command2
command3 "[email protected]"
}
Vous pouvez également utiliser read
travailler ligne par ligne:
cat filelist | while read i ; do something "$i" ; done
mais xargs vous obtient tous les args à la fois.
Dans quel environnement? Les fenêtres? UNIX? – Joey