"Finden" schließt durch fstype seltsames Verhalten aus

7

Ich versuche, den Befehl "find" das Dateisystem "/ proc" ausschließen zu lassen. Ich würde eine tragbare Lösung bevorzugen, um sie auf nicht GNU-basierten Hosts verwenden zu können (älteste AIX zum Beispiel, bei der "find" nicht die Option "-path" hat)

Folgendes habe ich versucht (auf einem Linux-Host) und eine teilweise gefilterte Ausgabe:

$ find /! -fstype proc> / dev / null
find: `/ proc / 9475 / task / 9535 / fdinfo / 7 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 10856 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 10856 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 10858 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 10858 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15650 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15650 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15654 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15654 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15656 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15656 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15657 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15657 ': Keine solche Datei oder kein solches Verzeichnis
find: `/ proc / 15663 ': Keine solche Datei oder kein solches Verzeichnis
usw ....

Ich verstehe nicht, warum "find" trotz des "! -Fstype proc" -Schalters weiter im "/ proc" -Dateisystem läuft?

Gilles Pion
quelle

Antworten:

7

Wie terdon erklärt hat , findwird das /procVerzeichnis weiterhin eingegeben , es werden jedoch keine Pfadnamen von diesem Dateisystemtyp zurückgegeben.

procVerwenden Sie, um einen Suchpfad zu entfernen, sobald der Dateisystemtyp erkannt wird

find / -fstype proc -prune -o -print

Da Sie dies jedoch auf einem alten Gerät ausführen möchten find, ist die -fstypeOption möglicherweise nicht verfügbar. Wenn -path(eine Standardoption von find) ebenfalls nicht verfügbar ist, wird es etwas schwierig, Vorschläge zu unterbreiten, da die Implementierung eindeutig nicht POSIX-kompatibel ist.

Eine Option könnte die Verwendung sein, -xdevdie dazu führen würde, dass Sie findsich streng im selben Dateisystem wie der Startpfad befinden. Sie müssten dann findfür jedes Dateisystem, das Sie untersuchen möchten, eines ausführen . Es könnte auch eine Option namens -x(wie bei BSD-Systemen) geben, die sich wie folgt verhält -xdev.

Wenn dies ebenfalls nicht möglich ist, müssen Sie möglicherweise auf verwenden zurückgreifen, -type d -name proc -pruneum alle aufgerufenen Verzeichnisse zu ignorieren proc.

Kusalananda
quelle
-path(ursprünglich eine BSD-Erweiterung, GNU-Fund wurde ursprünglich -wholenamespäter in -pathIIRC geändert ) ist eine relativ neue (2008) Ergänzung zu POSIX. Sie können auch verwenden -exec test /proc = {} \;, obwohl das sehr ineffizient wäre.
Stéphane Chazelas
Der "-prune" -Ansatz war meine ursprüngliche Option, aber leider ist der Dateisystemtyp "proc" unter AIX "procfs" und unter Linux "proc". Und leider gefällt aix nicht so: $ find / \( -fstype proc -o -fstype procfs \) -prune | headGeben Sie den folgenden Fehler ein:find: invalid filesystem type proc
Gilles Pion
@GillesPion Dann müssten Sie sich auf den Namen des Verzeichnisses verlassen, es sei denn, Sie erkennen den Betriebssystemtyp im Voraus und rufen findfür jedes Betriebssystem auf bestimmte Weise auf.
Kusalananda
5

Die -fstypeAnweisung weist findan, keine Ergebnisse für diesen Dateisystemtyp zurückzugeben. Dies bedeutet jedoch nicht, dass das /procVerzeichnis nicht angezeigt wird . Es bedeutet einfach, dass keine auf einem procDateisystem gefundenen Dateien zurückgegeben werden . Es muss jedoch noch das /procVerzeichnis durchsuchen, da nicht bekannt ist, ob etwas, ein Nicht-Proc-Dateisystem, bereitgestellt wurde /proc/something. Zum Beispiel finde ich auf meinem Bogen:

$ find /proc ! -fstype proc -printf '%p %F\n' 2>/dev/null 
/proc/sys/fs/binfmt_misc binfmt_misc
/proc/sys/fs/binfmt_misc/CLR binfmt_misc
/proc/sys/fs/binfmt_misc/register binfmt_misc
/proc/sys/fs/binfmt_misc/status binfmt_misc

Dies liegt daran, dass /proc/sys/fs/binfmt_misc/es sich nicht um ein Proc-Dateisystem handelt:

$ mount | grep proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=51,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12642)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)

Es gibt also zwei Mountpunkte, unter /procdenen Nicht-Proc-Dateisysteme gespeichert sind.

Beachten Sie daher, dass Ihre Frage nur Fehlermeldungen enthält. Keine dieser Dateien wurde tatsächlich von zurückgegeben find, daher scheint sie sich wie erwartet zu verhalten. Es geht durch die Dateien in /proc, berücksichtigt sie jedoch nicht als übereinstimmend, wenn sie sich in einem procDateisystem befinden.

terdon
quelle
statt "gibt dort gefundene Dateien nicht zurück" vielleicht "gibt dort keine Dateien vom Typ proc zurück, die dort gefunden werden"?
Jeff Schaller
@ JeffSchaller Ich versuche, keine Details anzugeben, weil ich nur ein vages Verständnis dafür habe /proc. Fühlen Sie sich noch freier als sonst, um Verbesserungen vorzunehmen.
Terdon
Zwischen-Update: / proc / sys / fs / binfmt_misc kann ein separates Dateisystem von / proc sein
Jeff Schaller
Ich würde hinzufügen, dass das OP diese Fehler sieht, weil find/ proc aufgezählt, bevor die Dateitypen untersucht werden; Sobald es sie versuchte, statwaren sie weg (Prozess beendet).
Jeff Schaller
binfmt_miscwird einfach in ein Verzeichnis innerhalb gemountet /proc(Sie können das mit sehen mount | grep binfmt; es gibt nichts Besonderes daran, Sie können einfach jedes Dateisystem, das Sie mögen, in jedes Verzeichnis mounten, das Sie mögen, z. B.mkdir -p fake_dir; echo systemd666 > fake_dir/comm; mount --bind fake_dir /proc/1
mosvy