
Geneigte Script-Experten! Eigentlich wollte ich nur wissen, ob ein Verzeichnis eine oder mehrere Dateien enthaelt. Falls keine Dateien da sind, sollte das Script verlassen werden. Den Befehl #!/bin/bash test -e ~/verzeichnis/* || exit 0 mag aber mein Linux nicht, nur, wenn sich _keine_ oder _eine_ Datei in dem Verzeichnis befindet, nicht aber, wenn es mehrere sind. Ich habe das Problem nun folgendermassen geloest: #!/bin/bash ls ~/verzeichnis > temp test -s ~/temp || exit 0 Ist das der Weisheit letzter Schluss? Immerhin funktioniert es so. Gruss Peter Blancke. -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux

On 13-Nov-98 Blancke, Peter wrote: | | Eigentlich wollte ich nur wissen, ob ein Verzeichnis eine oder mehrere | Dateien enthaelt. Falls keine Dateien da sind, sollte das Script Vorschlag: % test -n "`ls $direc`" || exit 0 Wobei die Var. direc natürlich einen Verz.pfad enthalten sollte. MfG Mounir Benzid -------------------------------------------------- e-mail: Mounir Benzid <benzid@uni-duesseldorf.de> Date: 14-Nov-98 Powerd by Linux -------------------------------------------------- -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux

Mounir Benzid schrieb:
On 13-Nov-98 Blancke, Peter wrote: | | Eigentlich wollte ich nur wissen, ob ein Verzeichnis eine oder mehrere | Dateien enthaelt. Falls keine Dateien da sind, sollte das Script
Vorschlag:
% test -n "`ls $direc`" || exit 0
Danke! Das funktioniert wirklich am alleschnellsten. Ich hatte den gleichen Befehl wie folgt eingegeben: test -n `ls $direc` || exit 0 da raunzt mich Test mit der Meldung "binary operator expected" an. _Mit_ Verwendung der Anfuehrungszeichen (") geht es. Gruss Peter Blancke. -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux

Blancke, Peter wrote: ... Eigentlich wollte ich nur wissen, ob ein Verzeichnis eine oder mehrere Dateien enthaelt. Falls keine Dateien da sind, sollte das Script verlassen werden.
Hi Peter, weiss zwar nicht ganz genau was du machen willst, aber vielleicht hilft dir folgendes Script weiter: #!/usr/bin/bash if [ -n "$1" ]; then path=$1 else path="." fi for dir in `find $path -type d -maxdepth 1 ! -empty` ; do # do anything !! num=`ls -A1 $dir | wc -l` echo "$num $dir" done Schau dir auf jeden Fall mal 'man find' an. Ciao Ingo -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux

On Fri, 13 Nov 1998, Blancke, Peter wrote:
Eigentlich wollte ich nur wissen, ob ein Verzeichnis eine oder mehrere Dateien enthaelt. Falls keine Dateien da sind, sollte das Script verlassen werden.
Das kannst Du evtl auch mit 'test -s $DIR' testen, habe ich aber nicht probiert. Fuer Naeheres siehe 'help test' (wenn Du BASH benutzt). IMHO ist Dein Kriterium aber ohnehin nur vorbereitendes oder begleitendes Beiwerk. Du hast doch bestimmt was anderes vor als "nur" dort rauszugehen ... Wie ist es, ZUERST eine Liste betroffener Verzeichnisse zusammenzustellen und die DANN zu bearbeiten ? DIRLIST=$( find $BASE -type d -a \! -empty ) # DIRLIST=$( find $BASE -type d -a -empty ) ... for DIR in $DIRLIST; do ... done Weiterhin kann ich noch empfehlen: 'man find' und Suche nach "-exec", "-ls", "-print" (auch wenn's implizit angenommen wird, schreibe ich's in Scripts hin -- das ist schliesslich nicht auf allen Plattformen so) 'man xargs', wenn die Liste furchtbar lang wird. Kommandozeilen sind selten in der Lage, mehrere tausend Parameter zu uebertragen. AFAIR war bei etwa 3800 oder so Schluss (also noch einiges vor 4096). Und dann geht mir noch was ganz anderes durch's Hirn: Willst Du kein leeres Verzeichnis bearbeiten oder brichst Du nur ab, weil sowieso keine Dateien da sind ? Ein Konstrukt der Art for FILE in $( ls $DIR ); do $CMD; done wird fuer leere File-Listen ohnehin den Koerper nie betreten :) G.Sittig@abo.FreiePresse.DE -- If you don't understand or are scared by any of the above ask your parents or an adult to help you. -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux

Gerhard Sittig schrieb:
On Fri, 13 Nov 1998, Blancke, Peter wrote:
Eigentlich wollte ich nur wissen, ob ein Verzeichnis eine oder mehrere Dateien enthaelt. Falls keine Dateien da sind, sollte das Script verlassen werden.
[...]
Das kannst Du evtl auch mit 'test -s $DIR' testen
Nein, geht so nicht.
Und dann geht mir noch was ganz anderes durch's Hirn: Willst Du kein leeres Verzeichnis bearbeiten oder brichst Du nur ab, weil sowieso keine Dateien da sind ? Ein Konstrukt der Art for FILE in $( ls $DIR ); do $CMD; done wird fuer leere File-Listen ohnehin den Koerper nie betreten :)
Das ist richtig, der For-Koerper wird nie betreten. Doch muss ich _vor_ Ausfuehrung der Datei-Versenderei ein Archiv-Directory anlegen. Daher war die Loesung nicht praktikabel. Ich zeige mal das Script, welches jetzt hier laeuft: 01 #!/bin/bash 02 ls ~/infodienst > ~/temp 03 test -s ~/temp || exit 0 04 tagesdatum=`date +%Y-%m-0` 05 mkdir ~/infodienst_archiv/$tagesdatum >> fehlerreport 2>&1 06 for i in /home/infodienst/infodienst/* ; do 07 # Protokollierung der erledigten Jobs 08 date >> cron.erledigte_jobs 2>&1 09 echo Infodienst versendet $i >> cron.erledigte_jobs 2>&1 10 echo "" >> cron.erledigte_jobs 2>&1 11 # Nachricht plus Signature zusammenstellen 12 cat $i > temp 13 cat infodienst.signature >> temp 14 # Mail versenden 15 for mailempfaenger in `cat infodienst.empfaenger` 16 do 17 mail $mailempfaenger -s "Infodienst" < temp >> fehlerreport 2>&1 18 done 19 # und versendete Nachrichten ins Archiv verschieben 20 mv $i /home/infodienst/infodienst_archiv/$tagesdatum >> fehlerreport 2>&1 21 done Damit ist die Problematik klar, das Archiv (Zeile 05) darf nur angelegt werden, wenn es in dem angegebenen Verzeichnis auch wirklich Dateien gab. Gibt es dort welche, werden diese an eine Liste von Mail-Empfaengern versendet und dann ins Archiv verschoben, anderenfalls passiert gar nichts. Die Aufgabe erledigt im uebrigen ein cron-job. Das Script funktioniert ja einwandfrei, mir schien nur der Test fuer ein leeres bzw. nicht leeres Verzeichnis (Zeilen 02 und 03) zu kompliziert und da ich Neuling mit Scripten bin, wollte ich einfach nur wissen, ob es einfacher geht. Aber ich denke, das ist schon eine einfache Loesung. Danke fuer zahlreiche Hinweise auch anderer hier. Gruss Peter Blancke. -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux
participants (4)
-
benzid@uni-duesseldorf.de
-
blancke@t-online.de
-
G.Sittig@abo.FreiePresse.DE
-
sieber@cs.tu-berlin.de