Je veux trouver une commande bash qui me permettra de grep chaque fichier dans un répertoire et d'écrire la sortie de ce grep dans un fichier séparé. Ma supposition aurait été de faire quelque chose comme ça
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
mais, pour autant que je sache, xargs n'aime pas les guillemets. Cependant, si je supprime les guillemets doubles, la commande redirige la sortie de la commande entière vers un seul fichier appelé '{}'. Out au lieu de vers une série de fichiers individuels.
Quelqu'un connaît-il un moyen de le faire en utilisant xargs? Je viens d'utiliser ce scénario grep comme exemple pour illustrer mon problème avec xargs, donc toutes les solutions qui n'utilisent pas xargs ne sont pas aussi applicables pour moi.
xargs
sans-0
: cela ne s'applique que lorsque vous canalisezfind
la sortie avecxargs
, non? quand je faisxargs -a <input_file>
comment utiliserais-je cela? La plupart des commandes aiment lesgrep
sorties avec\n
et non.\0.
Le seul moyen auquel je pense pour contourner cetr
problème est de l'utiliser à nouveau pour résoudre ce problème peut-être. Mais pourquoi est-il important de l'utiliser uniquement avec-0
?-0
,xargs
prendra vos noms de fichiers et cassera tous les espaces, guillemets et barres obliques inverses qu'ils contiennent. Vous devriez simplement oublier enxargs
tant qu'outil. Si vous avez des lignes, utilisez une boucle bash pour itérer les ligneswhile read line; do <command> "$REPLY"; done < file-with-lines
command | while ...
xargs
sont pas GNU), ilxargs
faut éviter à moins que l'on puisse l'utiliser avec-0
. Je vous remercie.xargs
, ce qui n'implique pas toujours l'analysels
ou l'utilisationsh -c
. Cela ne répond pas du tout à la question, mais c'est le premier résultat Google pour la question, ne faisant qu'ajouter à la confusion.xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
? Surtout, les règles des guillemets intégrés (doubles) et le symbole "-" à la fin. MerciUne solution sans
xargs
est la suivante:... et la même chose peut être faite avec
xargs
, il s'avère:Edit : guillemets simples ajoutés après la remarque de lhunath .
la source
Je suppose que votre exemple n'est qu'un exemple et que vous pourriez avoir besoin> pour d'autres choses. GNU Parallel http://www.gnu.org/software/parallel/ peut être votre secours. Il ne nécessite pas de guillemets supplémentaires tant que vos noms de fichiers ne contiennent pas \ n:
Si vous avez des noms de fichiers avec \ n:
En prime, vous obtenez les travaux exécutés en parallèle.
Regardez les vidéos d'introduction pour en savoir plus: http://pi.dk/1
L'installation de 10 secondes essaiera de faire une installation complète; si cela échoue, une installation personnelle; si cela échoue, une installation minimale:
Si vous devez le déplacer vers un serveur sur lequel GNU Parallel n'est pas installé, essayez
parallel --embed
.la source