Je sais que je ne réponds pas au xargs
question directement mais cela vaut la peine de mentionner find
's -exec
option.
É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
On peut faire en sorte que la commande find gère les espaces dans Dream Theater et King's X. Donc, pour trouver les batteurs de chaque groupe en utilisant 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 le -exec
option {}
représente le nom du fichier, y compris le chemin d'accès. Notez que vous n'avez pas besoin de l'échapper ou de le mettre entre guillemets.
La différence entre -exec
Les terminaisons de l'utilisateur ( +
y \;
) est que +
regroupe autant de noms de fichiers qu'il peut sur une seule ligne de commande. Alors que \;
exécutera la commande pour chaque nom de fichier.
Donc, find bands/ -type f -exec grep Drums {} +
aura pour résultat :
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
y find bands/ -type f -exec grep Drums {} \;
aura pour résultat :
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
Dans le cas de grep
cela a pour effet secondaire d'imprimer ou non le nom du 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
Options de l'UE -h
y -H
contrôlera si le nom du fichier est imprimé ou non, quelle que soit la façon dont l'option grep
s'appelle.
xargs
xargs
peut également contrôler la façon dont les fichiers de manuel se trouvent sur la ligne de commande.
xargs
regroupe par défaut tous les arguments sur une seule ligne. Afin de faire la même chose que -exec \;
utilise xargs -l
. Notez que le -t
L'option indique xargs
pour 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
Voyez que le -l
L'option indique à xargs d'exécuter grep pour chaque nom de fichier.
Par rapport à la valeur par défaut (c'est-à-dire aucune -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
a un meilleur contrôle sur le nombre de fichiers pouvant se trouver sur la ligne de commande. Donnez à la -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 que grep
a été exécuté avec deux noms de fichiers à cause de -l2
.
0 votes
Au lieu de
ls |grep mp3 |sed -n "7p"
vous pouvez simplement utiliserecho "Lemon Tree.mp3"
.1 votes
Duplicata possible de Comment puis-je utiliser xargs pour copier des fichiers dont le nom comporte des espaces et des guillemets ?
0 votes
Cette question trouve également une réponse dans stackoverflow.com/a/33528111/94687