2016-04-22 3 views
0

Ich schreibe ein Skript, das ein Grep auf .php-Dateien ausführt, aber ich möchte auch, dass es dasselbe grep für alle Dateien ausführt, die in den .php-Dateien enthalten sind.Gibt es eine Möglichkeit, eine Argumentliste vor dem Ausführen von -exec zu finden?

Ich bin mit der PHP-Funktion

get_included_files(); 

eine Liste der darin enthaltenen Dateien zu erzeugen (diese Liste wird dann in einer Datei gespeichert), und ich möchte, dass meine Entdeckung ein grep auf beiden .php Dateien ausführen gefunden von der Suche und alle Dateien in meiner Dateiliste aufgelistet.

Ich habe versucht, die folgenden:

find -iname \*.php -exec grep 'foo' $(cat list.txt) {} + 

find -iname \*.php | xargs -I {} grep 'foo' $(cat list.txt) {} 

In beiden Fällen bekomme ich entweder:

/usr/bin/finden: Liste Argument zu lange

/usr/bin/xargs: Argument-Liste zu lang

Jede Hilfe

+0

Kannst du nicht einfach 'zweimal laufen grep'? – gdlmx

Antwort

0

denken klar sein, würde ich Sie ab sein kann le Ihr Problem zu vermeiden, indem man zuerst die verbundene Liste konstruieren, dann xargs Verwendung zu grep bieten:

find -iname \*.php | cat list.txt - | xargs grep 'foo' 

Beachten Sie, dass die - in cat ‚s Argumente stdin in diesem Zusammenhang bezieht, dh die Liste der Dateien zurückgegeben von find.

Sie könnten auch eine sort -u dort einfügen, wenn Sie doppelte Daten vermeiden möchten.

Meine Annahme auf Ihrem Fehler ist, dass der Inhalt von list.txt selbst genug ist, um die grep call zu brechen; Sowohl find als auch xargs würden dies erkennen und den Befehl ohne Angabe von Gründen ablehnen.

0

In Ihren Befehlen werden zuerst alle Dateinamen in list.txt übergeben, um/xargs als Positionsargumente zu finden. In Ihrem Fall enthält diese Datei mehr Namen als die Begrenzung der OS.

So führen Sie einfach grep für jeden Namen in list.txt:

#!/bin/bash 
while IFS='' read -r line || [[ -n "$line" ]]; do 
    grep 'foo' "$line" 
done < list.txt