Grep bei allen Dateinamen in einem Verzeichnis

405
Fueled By Coffee

Ich möchte den Prozessstatus für alle Dienste abrufen, die in einem bestimmten Verzeichnis ausgeführt werden. Im Moment kann ich eins nach dem anderen überprüfen ps -ef | grep ServiceName. Aber gibt es einen Weg zum lsVerzeichnis und zu psjedem Dienst?

So etwas ps -ef | grep < ls?

1
Suchen Sie nach 'ps -ef | grep "$ (ls)" `? incBrain vor 7 Jahren 1
@incBrain Genau danke! Geben Sie eine Antwort, wenn Sie Wertschätzung wünschen Fueled By Coffee vor 7 Jahren 0

3 Antworten auf die Frage

2
incBrain

Sie haben es bereits als Kommentar gepostet, dies sollte Ihren Wünschen entsprechen:

ps -ef | grep "$(ls)" 
2
Kamil Maciorowski

In Bash:

ps -ef | grep "$(ls)" 

(Dieselbe Zeile erschien in incBrain's Kommentar, während ich den Rest meiner Antwort in Debian / Bash komponierte und testete.)

Wenn das Muster in der psAusgabe als Befehlszeilenargument (nicht als Befehl) oder als Teil des Befehls angezeigt wird, wird Abfall erzeugt . Um dies zu reduzieren, würde ich findanstelle von lsden vollständigen Pfad verwenden:

ps -ef | grep -f <(find -L "$(pwd)" -maxdepth 1 -type f) 

Trotzdem kann es zu unerwünschten zusätzlichen Ausgaben kommen.

Beachten Sie, dass dies nicht der Fall ist

Dienste, die in einem bestimmten Verzeichnis ausgeführt werden

Vielmehr verarbeitet er mit ausführbaren Dateien in einem bestimmten Verzeichnis .

Um das aktuelle Arbeitsverzeichnis eines Prozesses mitzuteilen, lesen Sie möglicherweise /proc/<PID>/cwd. Das nächste Beispiel ist eine (schnelle und schmutzige) psAlternative, die zeigt, dass Sie Informationen /procin einem gewünschten Formular extrahieren können :

sudo bash -c 'for i in /proc/[1-9]* ; do PID=$(basename "$i"); E=$(readlink "$/exe"); D=$(readlink "$/cwd"); echo -e "PID=$\tEXE=$\tCWD=$" ; done | grep "CWD=$(pwd)$"' 

Sie müssen sudoZugriff auf alle Prozesse erhalten. Wenn dies nicht erforderlich ist und Sie es als normaler Benutzer ausführen möchten, reicht der Teil innerhalb der 'Trennzeichen aus.

0
allo

Vielleicht so etwas:

processes="$(ps -ef)" for file in *;do grep "$file" <<<"$processes" done