Je sais que je ne réponds pas xargs
directement à la question, mais cela vaut la peine de mentionner find
l' -exec
option de.
Étant donné le système de fichiers suivant:
[root@localhost bokeh]# tree --charset assci bands
bands
|-- Dream\ Theater
|-- King's\ X
|-- Megadeth
`-- Rush
0 directories, 4 files
La commande find peut être effectuée pour gérer l'espace dans Dream Theater et King's X. Ainsi, pour trouver les batteurs de chaque groupe à l'aide de grep:
[root@localhost]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
Dans l' -exec
option {}
représente le nom de fichier, y compris le chemin. Notez que vous n'avez pas à y échapper ou à le mettre entre guillemets.
La différence entre -exec
les terminateurs de ( +
et \;
) est qu'il +
regroupe autant de noms de fichiers qu'il peut sur une seule ligne de commande. Tandis que \;
va exécuter la commande pour chaque nom de fichier.
Donc, cela find bands/ -type f -exec grep Drums {} +
se traduira par:
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
et find bands/ -type f -exec grep Drums {} \;
se traduira par:
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
Dans ce cas, grep
cela a pour effet secondaire d'imprimer ou non le nom de fichier.
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} \;
Drums:Mike Mangini
Drums: Neil Peart
Drums:Jerry Gaskill
Drums:Dirk Verbeuren
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
Bien sûr, grep
les options de -h
et -H
contrôleront si le nom de fichier est imprimé ou non, quelle que soit la façon dont il grep
est appelé.
xargs
xargs
peut également contrôler la façon dont les fichiers man se trouvent sur la ligne de commande.
xargs
par défaut regroupe tous les arguments sur une seule ligne. Afin de faire la même chose qui -exec \;
utilise xargs -l
. Notez que l' -t
option indique xargs
d'imprimer la commande avant de l'exécuter.
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l -t grep Drums
grep Drums ./bands/Dream Theater
Drums:Mike Mangini
grep Drums ./bands/Rush
Drums: Neil Peart
grep Drums ./bands/King's X
Drums:Jerry Gaskill
grep Drums ./bands/Megadeth
Drums:Dirk Verbeuren
Vérifiez que l' -l
option indique à xargs d'exécuter grep pour chaque nom de fichier.
Par rapport à la valeur par défaut (c'est-à-dire sans -l
option):
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush ./bands/King's X ./bands/Megadeth
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
xargs
contrôle mieux le nombre de fichiers sur la ligne de commande. Donnez à l' -l
option le nombre maximum de fichiers par commande.
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l2 -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
grep Drums ./bands/King's X ./bands/Megadeth
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
[root@localhost bokeh]#
Voir qui a grep
été exécuté avec deux noms de fichiers à cause de -l2
.
ls |grep mp3 |sed -n "7p"
vous pouvez simplement utiliserecho "Lemon Tree.mp3"
.