2017-09-06 2 views
0

Hier vermeiden Dokumente die Erstellung einer Zwischen-Einmal-Datei. Ich hatte gehofft, dass ich davon Gebrauch machen könnte, wenn ich die vollständigen Pfade von 20 möglichen Dateien bekomme (ohne die Syntax find -o zu verwenden). Ich erwartete folgendes Werk:grep -f mit einem hier Dokument

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

aber ich bekomme:

grep: option requires an argument -- f 

Bin ich Missverständnis, wie hier Dokumente arbeiten? Oder spielt grep -f nicht gut mit Dateideskriptoren?

Ich bin auch offen für Lösungen mit find, die eine Liste von -name Werte nehmen kann, aber ich möchte nicht -o 20 mal eingeben müssen.


Beste Alternative:

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

Das ist intellektuell unbefriedigend, weil Sie find auf der gesamten Dateihierarchie einmal für jedes Suchmuster ausführen, die nicht gut für große Verzeichnishierarchien skaliert.

+0

Nicht folge total, aber willst du einfach 'grep -f-' wo sagt das grep eine Liste von Mustern aus dem Standard zu lesen? Sie müssten dann auch eine Liste von Dateien in der Befehlszeichenfolge angeben. – stevesliva

+0

Hmmmm, es ist verwandt, aber ich glaube nicht, dass ich es über stdin weitergeben kann, weil ich das stdout des 'find' Befehls benötige, um die stdin zum' grep' Befehl zu sein. –

Antwort

1

Wenn Sie auf einem System mit/proc (zB Linux) sind, versuchen Sie:

#!/bin/sh 

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

Oder, wenn Ihre Shell-Prozess Substitution unterstützt (Bourne-Shell nicht):

#!/bin/bash 

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

Die zweite ist, was ich für die beste Lösung halten würde. Es funktioniert unter Mac OS X (ohne '/ proc'). Und die Prozesssubstitution ist wunderbar, daher lohnt es sich, sich von Bourne Shell zu erzwingen (was ich sowieso nur für das Scripting verwende, nicht für die interaktive Befehlszeilennutzung). Ich werde jeden Tag ein größerer Fan von Prozesssubstitution. –