find suchtiefe beschraenken

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

find suchtiefe beschraenken

Beitrag von roli » 28.03.2006 11:21:33

Hi,

vorweg, ich sitze hier an einem SunOS 5.8, Debian ist leider nur @Home.

Ich habe mir ein Script geschrieben, das in 4 Verzeichnissen mir alle ausfuehrbaren Dateien anzeigen soll. Jedes dieser Verzeichnisse, hat massig Unterverzeichnisse, die mich allerdings nicht interessieren. Wie kann ich mein Script dazu bringen nur die 4 Verzeichnisse zu durchsuchen? Wenn die Unterverzeichnisse mit durchsucht werden, "explodiert" die Laufzeit.
Hier mal der "interessante" Teil des Script's:

Code: Alles auswählen

for verz in V1 V2 V3 V4
do
   find $verz -type f -a \( -perm -100 -o -perm -010 -o -perm -001\) -print
done
Dankbar fuer jeden Hinweis
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

v.errath@bcom.at
Beiträge: 18
Registriert: 22.02.2006 12:10:05

Beitrag von v.errath@bcom.at » 28.03.2006 11:29:32

Code: Alles auswählen

find $verz -maxdepth 1 -type f ..
Der Parameter --maxdepth beschränkt die Anzahl der unterverzeichnisse, die berücksichtigt werden.

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 28.03.2006 12:05:37

Hi,

du hast schon recht, @Home auf Debian mache ich das auch so, aber hier bin ich leider "auf'fe Arbeit" an einem SunOS 5.8, und da gibt's das nicht, leider. Der Ansatz muss also was genereller sein.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 28.03.2006 12:49:20

Das einfachste duerfte sein, das Paket findutils von http://www.sunfreeware.com nachzuinstallieren. Der Solaris find ist auch in anderer Hinsicht nur sehr eingeschraenkt...

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 28.03.2006 13:07:00

nachdem nepos das einfachste genannt hat nenne ich das beste:
DebianGNU/* installieren :D

BTW - das ist nicht das erste mal das sich Solaris, SunOS & Co mit eingzogenem Schwanz vom Acker machen muss. Die ganzen GNU Extensions zu diversen Tools ist Fehlanzeige auf nicht Debian Systemen.

check this out ...
http://www.debianforum.de/forum/viewtop ... hlight=sed

markus

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 28.03.2006 13:15:18

Hi Ihr 2,

danke fuer eure Vorschlaege, aber das OS zu wechseln, ist nicht realistisch. Ich bin hier als Berater taetig, und werde waehrend meines kurzen daseins/hierseins, den Vorstand davon nicht ueberzeugen koennen.
Einfach mal so Software nachzuinstallieren (findutils) wird wohl auch nix, ich hatte schon mal nach mc oder was vergleichbarem gefragt, ohne Erfolg.
Ich suche also nach einer Loesung mit den (bescheidenen) Bordmitteln die ich habe.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 28.03.2006 14:26:52

Folgendes könnte funktionieren:

Code: Alles auswählen

find $verz -type f -a \( -perm -100 -o -perm -010 -o -perm -001\)  -exec perl -e "((grep{\$_=~m|/|}split('',\$ARGV[1]))>\$ARGV[0])?exit(-1):exit(0);" 2 \{\} \;-print
Das erste Argument (hier 2) bestimmt wieviele "/" gefunden werden dürfen. Das mußt du entsprechend anpassen. so würde

Code: Alles auswählen

perl -e "print(grep{$_=~m|/|}split('',\$ARGV[0]))" $verz
die Zahl der im "$verz" vorhandenen "/" auspucken.
Das ist keine perfekte Lösung, aber das beste was mir dazu einfällt.

p.s.: Wenn Perl nicht vorhanden ist kannst du auch ein Script schreiben das sich mit "exit 0" oder beim missfallen mit "exit -1" beendet und es mit "-exec sh pfas/zu/script 1 }{\} \;" azsführen. Bei einem Exitcode != 0 wird der Fund verworfen.

p.p.s.: Mir fällt gerade auf, daß find dennoch alle Verzeichnisse durcharbeiten würde... Eventuell könntest du über "-exec" "kill" aufrufen und "find" abwürgen...

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 28.03.2006 15:48:16

Ich wuerd versuchen, dass du diese Pakete von sunfreeware.com installieren kannst. Das ist die beste Wahl denke ich und damit hast du auch den wenigsten Aufwand.
Umsonst wird die Seite ja auch nicht von Sun supported ;)

Benutzeravatar
h-man
Beiträge: 745
Registriert: 05.02.2003 13:10:08
Wohnort: Berlin
Kontaktdaten:

Re: find suchtiefe beschraenken

Beitrag von h-man » 28.03.2006 16:07:35

roli hat geschrieben:...
Dankbar fuer jeden Hinweis
moin, setz doch die berechtigungen der verzeichnisse, die du nicht durchsuchen willst, auf "verboten". dann wirft dein find einen fehler und gut ist.

anders gesagt: mach das 'x' und 'r' weg :-)
Nieder mit der Schwerkraft.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 28.03.2006 16:48:29

Dann werden sicher 100 andere Dinge nicht mehr korrekt klappen. Das mit den Rechten wuerd ich auf keinen Fall machen.

Benutzeravatar
seep
Beiträge: 544
Registriert: 31.10.2004 14:21:08
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: HSK

Beitrag von seep » 28.03.2006 17:19:33

roli hat geschrieben:Ich suche also nach einer Loesung mit den (bescheidenen) Bordmitteln die ich habe.
Ich denke, mit Bordmitteln alleine wirst Du da keine oder keine schnellere Lösung hinbekommen, sondern immer noch etwas hinzuprogrammieren müssen. Mag sein, daß man da irgendwie mit "ls -R" weiterkommen könnte, aber auch dessen Ausgabe müßte erst wieder von einem Programm/Script interpretiert werden (und dieses Programm müßte erst noch geschrieben werden).

Den Vorstand würde ich versuchen, davon zu überzeugen, eher Zeit in die Installation von GNU find nach /usr/local/bin und eine Qualitätskontrolle Deines Scriptes zu investieren als hier Zeit und damit Geld in die Programmierung eines Workarounds zu versenken, der ja anschließend auch noch qa't werden muß.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 28.03.2006 17:22:59

http://www.sunfreeware.com/ war auch mein erster Gedanke, aber darüber hinaus frage ich mich, warum du ein Utility zum "recursiven Durchsuchen" einsetzt, wenn du es gar nicht benötigst:

Code: Alles auswählen

#!/bin/sh

for verz in v1 v2 v3 v4
do
  for file in $verz/*
  do
    [ -x $file ] || continue
    echo $file
  done
done

Gruß
gms
Zuletzt geändert von gms am 28.03.2006 17:34:11, insgesamt 1-mal geändert.

Benutzeravatar
seep
Beiträge: 544
Registriert: 31.10.2004 14:21:08
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: HSK

Beitrag von seep » 28.03.2006 17:27:45

Er will in den vier Verzeichnissen maximal vier Ebenen tief suchen, so habe ich das jedenfalls verstanden. Und dann muß er eben doch rekursiv suchen.

edit: Jetzt habe ich nochmal ganz genau den ersten Post durchgelesen, und ja, jetzt verstehe ich es auch so, daß gar nicht rekursiv geschaut werden muß!? Dann wäre der Vierzeiler von gms doch eine prima Lösung, sofern die SH unter Solaris ein "test -x" kennt, sonst muß roli noch die bash von sunfreeware.com installieren. :wink:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 28.03.2006 18:06:22

seep hat geschrieben:Dann wäre der Vierzeiler von gms doch eine prima Lösung, sofern die SH unter Solaris ein "test -x" kennt, sonst muß roli noch die bash von sunfreeware.com installieren. :wink:
muß er nicht :)

wenn aber doch, bzw wenn er alle Rechte (use,group,other) einzeln überprüfen möchte, dann könnte er z.B. getfacl verwenden:

Code: Alles auswählen

getfacl $file | grep -v "#" | grep x >/dev/null || continue
das sollte dann sogar mit acl's funktionieren


möglicherweise müssen auch noch die Verzeichnisse ausgeschlossen werden

Code: Alles auswählen

 [ ! -d $file ] || continue
Gruß
gms

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 29.03.2006 09:17:35

Moin zusammen,

danke fuer die vielen Tip's. Ich werde gleich mal die Idee von gms checken, das denke ich ist die Loesung.
Nochmal ein paar Hintergruende.
Ich habe (genau) vier Verzeichnisse, die ich durchsuchen will/muss, ohne die jeweiligen Unterverzeichnisse. Mich interessieren in diesen vier Verzeichnissen nur die Dateien die ausfuehrbar sind.
Das mit dem nachinstallieren irgendwelcher SW ist sicherlich die vernuenftigste Loesung, aber,
1) Ich bin hier externer, mein Vertrag laeuft (erstmal) bis zum 30.6, also hat mein Wort nur beschraenktes Gewicht
2) Ich mache hier quasi "Sterbebegleitung" fuer das System, es soll im Sommer abgeloest werden

Das Ganze laeuft eh nur noch so leidlich, und da kann ich die Angst der anderen verstehen, das durch Installation weiterer SW ggf. dann doch irgendetwas nicht mehr so funktioniert wie's soll. Wobei, mit Teilausfaellen habe ich andauernd zu kaempfen. Man koennt meinen Job auch als Feuerwehrmann bezeichnen, ist stehe quasi mit nem Eimer Wasser in der Hand bereit, um zu Loeschen wenn's brennt. Mit dem Script was ich mir da bauen moechte, haette ich sozusagen den Eimer Wasser "Next Generation", wenn ich's so hinbekomme wie ich's mir denke.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 29.03.2006 11:09:22

Hi,

"nu geit dat".
Der Eimer Wasser "Next Generation" hat erfolgreich seinen Betrieb aufgenommen.
Dank dem Tip von gms ist mein Seelenfrieden wieder hergestellt.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Antworten