2017-09-06 2 views
0

Ici, les documents évitent la création d'un fichier intermédiaire à utilisation unique. J'espérais faire usage de cela lors de l'obtention des chemins complets de 20 fichiers possibles (sans utiliser la syntaxe find -o). Je me attendais à ce qui suit au travail:grep -f avec un document ici

find | grep -f <<EOF 
Controller.java 
Main.java 
Config.java 
EOF 

mais je reçois:

grep: option requires an argument -- f 

que je comprends mal comment ici les documents de travail? Ou grep -f ne joue pas bien avec les descripteurs de fichiers?

Je suis également ouvert aux solutions avec find qui peut prendre une liste de -name valeurs, mais je ne veux pas avoir à taper -o 20 fois.


meilleure alternative:

cat <<EOF | xargs --delimiter '\n' --max-args=1 -I% find -iname "*%*" 
Controller.java 
Main.java 
Config.java 
EOF 

Ceci est intellectuellement peu satisfaisant parce que vous êtes en cours d'exécution find sur toute la hiérarchie de fichiers une fois pour chaque modèle de recherche qui ne sera pas bien échelle pour les grandes hiérarchies de répertoires.

+0

Non totalement suivre, mais voulez-vous juste 'grep -f-' où cela indique à grep de lire une liste de modèles de standard dans? Vous devrez alors également lui donner une liste de fichiers dans la chaîne de commande. – stevesliva

+0

Hmmmm, c'est lié mais je ne pense pas pouvoir le passer via stdin car j'ai besoin de la commande stdout de la commande 'find' pour être la commande stdin de la commande' grep'. –

Répondre

1

Si vous êtes sur un système avec/proc (par exemple linux), essayez:

#!/bin/sh 

find . | grep -f /proc/self/fd/3 3<< EOF 
Controller.java 
Main.java 
Config.java 
EOF 

Ou, si votre shell prend en charge la substitution de processus (Bourne Shell ne fonctionne pas):

#!/bin/bash 

find . | grep -f <(cat << EOF 
Controller.java 
Main.java 
Config.java 
EOF 
) 
+0

Le 2ème est ce que je considère comme la meilleure solution. Cela fonctionne sur Mac OS X (qui n'a pas '/ proc'). Et la substitution de processus est merveilleuse, donc il vaut la peine de se forcer Bourne Shell (que je n'utilise que pour les scripts, et non pas l'utilisation interactive de la ligne de commande). Je deviens un plus grand fan de la substitution de processus chaque jour qui passe. –