C
Crazy-X
Grünschnabel
Hi,
Der Betreff erklärt mein Problem eigentlich mehr als deutlich: Ich krieg' den find Befehl nicht auf die Reihe. Ich mein, welchen Stoff haben die Entiwckler davon denn gekifft, als sie das verbrochen haben? Logisch konsequent und inutuitiv ist die Bedinung von find jedenfalls nicht:
Also ich habe mal zu Testzwecken ein paar Dateien (und Verzeichnisse) im System verteilt, die alle dem User "lionel" gehören:
Jetzt möchte ich bei der Suche aber bestimmte Verzeichnisse ausschließen können. Kurz ge'google't und man findet folgende Lösung, aber scheinbar nirgendwo eine gute Erklärung dazu:
Also einen Blick in "man find", was allerdings nicht den erhofften "Aha-Effekt" bringt sonder nur noch mehr verwirrung stiftet:
Wieso hat "-prune" einen boolschen Wert und was zum Teufel hat das mit "-depth" zu tun?? Nach langem Überlegen habe ich mir das jetzt mal so erklärt:
"-path /etc" = A
"-prune" = B
"-user lionel" = C
Boolsche Gleichung:
A ^ B v C ( A UND B ODER C)
Falls A = 0 ist (das Verzeichnis ist nicht /etc), braucht der Ausdruck B nicht untersucht zu werden, da das Ergebnis von A ^ B bereits bekannt ist. Da aber noch ein Oder-Zweig existiert, der die ganze Gleichung noch wahr machen kann, wird der Ausdruck C ausgewertet.
Falls das Verzeichnis aber "/etc" enthält (A = 1) MUSS B ausgewertet werden, um das Ergebnis von A ^ B bestimmen zu können. Und wenn er auf "-prune" trifft, lässt er das Verzeichnis aus. (Und da der erste Teil der Oder Gleichung dann wahr ist, muss C nicht mehr ausgewertet werden.)
Stimmt das soweit? (Ich hoffe ich habe das mit der boolschen Gleichung nicht zu kompliziert gemacht...)
Nun zu weiteren Abarten von find:
Im 2. Befehl taucht ja jetzt trotzdem immer noch der Eintrag "/etc" auf. (Wieso eigentlich?) Dieser soll jetzt aber auch noch unterdrückt werden. Aus einem Skript (zudem ich evtl. in einem späteren Post noch ein paar Fragen habe) habe ich folgende Lösung:
Wieso funktioniert dieser Befehl nun, folgende aber nicht:
Obwohl auf vielen Seiten erklärt wird, dass man mit den Klammern mehrere Verzeichnisse auf einmal ausschließen kann. (Bei \( -path /etc -or -path /mnt \) funktionierts schließlich auch). Wie gesagt, logisch konsequent ist das wirklich nicht... :-((
Ich hoffe hier kann mir jemand helfen. Bin echt schon seit mehreren Wochen am verzweifeln.
TIA
Crazy-X
Der Betreff erklärt mein Problem eigentlich mehr als deutlich: Ich krieg' den find Befehl nicht auf die Reihe. Ich mein, welchen Stoff haben die Entiwckler davon denn gekifft, als sie das verbrochen haben? Logisch konsequent und inutuitiv ist die Bedinung von find jedenfalls nicht:
Also ich habe mal zu Testzwecken ein paar Dateien (und Verzeichnisse) im System verteilt, die alle dem User "lionel" gehören:
Code:
me@zombie $ find / -xdev -user lionel
/etc/fnord
/etc/fnord2
/mnt/blablub
/usr/src/lionel_test
/usr/fnord
/usr/lionel_test2
/usr/dir_lionel
/usr/dir_lionel/blablub
Jetzt möchte ich bei der Suche aber bestimmte Verzeichnisse ausschließen können. Kurz ge'google't und man findet folgende Lösung, aber scheinbar nirgendwo eine gute Erklärung dazu:
Code:
me@zombie $ find / -xdev -path /etc -prune -or -user lionel
/etc
/mnt/blablub
/usr/src/lionel_test
/usr/fnord
/usr/lionel_test2
/usr/dir_lionel
/usr/dir_lionel/blablub
Also einen Blick in "man find", was allerdings nicht den erhofften "Aha-Effekt" bringt sonder nur noch mehr verwirrung stiftet:
man find schrieb:-prune If -depth is not given, true; do not descend the current directory. If -depth is given, false; no effect.
Wieso hat "-prune" einen boolschen Wert und was zum Teufel hat das mit "-depth" zu tun?? Nach langem Überlegen habe ich mir das jetzt mal so erklärt:
"-path /etc" = A
"-prune" = B
"-user lionel" = C
Boolsche Gleichung:
A ^ B v C ( A UND B ODER C)
Falls A = 0 ist (das Verzeichnis ist nicht /etc), braucht der Ausdruck B nicht untersucht zu werden, da das Ergebnis von A ^ B bereits bekannt ist. Da aber noch ein Oder-Zweig existiert, der die ganze Gleichung noch wahr machen kann, wird der Ausdruck C ausgewertet.
Falls das Verzeichnis aber "/etc" enthält (A = 1) MUSS B ausgewertet werden, um das Ergebnis von A ^ B bestimmen zu können. Und wenn er auf "-prune" trifft, lässt er das Verzeichnis aus. (Und da der erste Teil der Oder Gleichung dann wahr ist, muss C nicht mehr ausgewertet werden.)
Stimmt das soweit? (Ich hoffe ich habe das mit der boolschen Gleichung nicht zu kompliziert gemacht...)
Nun zu weiteren Abarten von find:
Im 2. Befehl taucht ja jetzt trotzdem immer noch der Eintrag "/etc" auf. (Wieso eigentlich?) Dieser soll jetzt aber auch noch unterdrückt werden. Aus einem Skript (zudem ich evtl. in einem späteren Post noch ein paar Fragen habe) habe ich folgende Lösung:
Code:
me@zombie $ find / -xdev -path /etc -prune -path "/etc/*" -prune -or -user lionel
/mnt/blablub
/usr/src/lionel_test
[...]
Wieso funktioniert dieser Befehl nun, folgende aber nicht:
Code:
me@zombie $ find / -xdev -path "/etc*" -prune -or -user lionel
me@zombie $ find / -xdev \( -path /etc -or -path "/etc/*" \) -prune -or -user lionel
Obwohl auf vielen Seiten erklärt wird, dass man mit den Klammern mehrere Verzeichnisse auf einmal ausschließen kann. (Bei \( -path /etc -or -path /mnt \) funktionierts schließlich auch). Wie gesagt, logisch konsequent ist das wirklich nicht... :-((
Ich hoffe hier kann mir jemand helfen. Bin echt schon seit mehreren Wochen am verzweifeln.
TIA
Crazy-X