Überprüfen ob ein Verzeichnis leer ist

Hallo,

kann mir wer auf die Schnelle sagen, wie ich in einem Skript auf die Schnelle prüfen kann, ob ein Verzeichnis leer ist, oder noch besser, ob Dateien mit einem bestimmten Erstellungsdatum vorhanden sind?

Gruß

Thomas

Hallo,

kann mir wer auf die Schnelle sagen, wie ich in einem Skript
auf die Schnelle prüfen kann, ob ein Verzeichnis leer ist,
oder noch besser, ob Dateien mit einem bestimmten
Erstellungsdatum vorhanden sind?

„man find“

Tip -> wc -l ist auch ein ganz nützliches Tool :wink:

„man wc“

polarman

Hallo Polarman,

beide Lösungen gefallen mir, leider habe ich noch keine Idee, wie ich das in einer If-Abfrage verwenden könnte. Kannst Du mir hier noch einen Tip geben?

Gruß

Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

beide Lösungen gefallen mir, leider habe ich noch keine Idee,
wie ich das in einer If-Abfrage verwenden könnte. Kannst Du
mir hier noch einen Tip geben?

So schwer ist das nicht. Mit ein bisschen Tüfteln kommt man auf

if [`ls -1a|wc -l` -gt 2]; then echo 1; fi

Das spuckt dir 1 aus, wenn das aktuelle Verzeichnis leer ist.

(das >2 braucht man, da ein ls -a immer ‚.‘ und ‚…‘ mit ausspuckt)

Grüße,
Moritz

Hallo Moritz,

So schwer ist das nicht. Mit ein bisschen Tüfteln kommt man
auf

if [ls -1a|wc -l -gt 2]; then echo 1; fi

Das spuckt dir 1 aus, wenn das aktuelle Verzeichnis leer ist.

(das >2 braucht man, da ein ls -a immer ‚.‘ und ‚…‘ mit
ausspuckt)

eigentlich schon fast perfekt. Wenn ich nun das ganze noch so einschränken möchte, daß nur Dateien berücksichtigt werden, die nicht älter als 24 Stunden sind, wie würde das dann aussehen.
Ist zwar sicher trivial, aber als Linux-Fast-Newbie ist auch das einfache manchmal etwas verquer.

Gruß

Thomas

Hallo Thomas,

So schwer ist das nicht. Mit ein bisschen Tüfteln kommt man
auf

if [ls -1a|wc -l -gt 2]; then echo 1; fi

Das spuckt dir 1 aus, wenn das aktuelle Verzeichnis leer ist.

Das soll wahrscheinlich heissen: wenn das aktuelle Verzeichnis nicht leer ist?!

(das >2 braucht man, da ein ls -a immer ‚.‘ und ‚…‘ mit
ausspuckt)

eigentlich schon fast perfekt. Wenn ich nun das ganze noch so
einschränken möchte, daß nur Dateien berücksichtigt werden,
die nicht älter als 24 Stunden sind, wie würde das dann
aussehen.

ersetze ls durch einen Aufruf von von find und verwende sowas wie

find meinVerzeichnis/ -mtime -1

genauere Informationen welches der vielen *time Statements Du verwenden möchtest liefert Dir die Man-Page zu find:

man find

Ach ja, noch ein kleiner Tip am Rande:
mit den Backticks (`) kannst Du keine Verschachtelungen von Kommando-Aufrufen vornehmen. Bei der Verwendung der Bash ist es daher unter Umstaenden sinnvoller das mit dem Aufruf $(Kommando) zu machen.
Damit sind dann solche Konstrukte wie $(Kommando1 $(Kommando2)) möglich, falls Du Dir die Argumente fuer ein Kommando dynamisch aus einem anderen erzeugen lassen willst. In Deinem Fall koennte das dann so aussehen:

if [$(find . -mtime -1|wc -l) -gt 1]; then echo 1; fi

hth micha

Hallo Thomas,

Hi Klaus,

Ach ja, noch ein kleiner Tip am Rande:
mit den Backticks (`) kannst Du keine Verschachtelungen von
Kommando-Aufrufen vornehmen.

Huh?

$ echo `\`echo onfranzr |tr a-z n-za-m\` \`echo $SHELL\`` `echo fhpxf |\`which tr\` a-z n-za-m`!

HTH,
Gruss vom Frank.

Hi Klaus,

Hallo Erwin,

Ach ja, noch ein kleiner Tip am Rande:
mit den Backticks (`) kannst Du keine Verschachtelungen von
Kommando-Aufrufen vornehmen.

Huh?

$ echo \echo onfranzr |tr a-z n-za-m` `echo
$SHELL` echo fhpxf |`which tr` a-z n-za-m`!

Ich bin beeindruckt! Koenntest Du vielleicht mal noch was huebsches mit 3 Verschachtelungen basteln?

Naja, kann ja zum Glueck jeder selber entscheiden, welches der beiden Code-Fragmente er nach 2 Wochen noch besser versteht… :wink:

$ echo $($(echo onfranzr|$(which tr) a-z n-za-m) $(echo $SHELL)) $(echo fhpxf|$(which tr) a-z n-za-m)

gruesse
micha

Hallo Micha,

der Befehl sieht ja eigentlich ganz einfach aus, allerdings bekomme ich einen Fehlermeldung.
Evtl. habe ich ja was falsch gemacht. Waäre nur interessant, wo.

/usr/sbin/senden: find /var/spool/uucp/uucpmail/D./. -mtime -1|wc -1) -gt 1: division by 0 (error token is „/spool/uucp/uucpmail/D./. -mtime -1|wc -1) -gt 1“)

Der Aufruf in der Datei lautet momentan:

#!/bin/bash
if [$[find /var/spool/uucp/uucpmail/D./. -mtime -1|wc -1) -gt 1];
then echo 1;
fi

Gruß

Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Thomas,

der Befehl sieht ja eigentlich ganz einfach aus, allerdings
bekomme ich einen Fehlermeldung.
Evtl. habe ich ja was falsch gemacht. Waäre nur interessant,
wo.

/usr/sbin/senden: find /var/spool/uucp/uucpmail/D./. -mtime
-1|wc -1) -gt 1: division by 0 (error token is
„/spool/uucp/uucpmail/D./. -mtime -1|wc -1) -gt 1“)

Der Aufruf in der Datei lautet momentan:

#!/bin/bash
if [$[find /var/spool/uucp/uucpmail/D./. -mtime -1|wc -1) -gt
1];
then echo 1;
fi

hinter der eckigen Klammer nach dem if und vor der entsprechenden schliessenden eckigen Klammer nach dem „-gt 1“ muss ein Leerzeichen und die eckige Klammer nach dem ersten $ muss eine runde sein, ausserdem ist es nicht „wc - 1“ sondern „wc - l“ wobei das „l“ fuer „lines“ steht. Im Zweifelsfall nimm bitte die Zeile aus meinem Posting und paste sie in Dein Script. Ansonsten helfen Dir „man test“ und „man wc“ weiter.

hth
micha

Hallo Micha,

jetzt bleibt nur noch ein Problem:

/usr/sbin/senden: [: -gt: unary operator expected

Gruß

Thomas

Hallo Thomas,

hinter der eckigen Klammer nach dem if und vor der
entsprechenden schliessenden eckigen Klammer nach dem „-gt 1“
muss ein Leerzeichen und die eckige Klammer nach dem ersten $
muss eine runde sein, ausserdem ist es nicht „wc - 1
sondern „wc - l“ wobei das „l“ fuer „lines“ steht. Im
Zweifelsfall nimm bitte die Zeile aus meinem Posting und paste
sie in Dein Script. Ansonsten helfen Dir „man test“ und „man
wc“ weiter.

hth
micha

Hallo Micha,

Hallo Mathias,

jetzt bleibt nur noch ein Problem:

/usr/sbin/senden: [: -gt: unary operator expected

Vielleicht solltest Du zur Abwechslung einfach mal versuchen, zu verstehen, was er Dir schreibt. Wenn das zu schwer ist, reicht fuer den Anfang auch richtiges abtippen. (Hint: die meisten modernen Betriebssysteme koennen copy and paste.)

Gruss vom Frank.

mit den Backticks (`) kannst Du keine Verschachtelungen von
Kommando-Aufrufen vornehmen.

Huh?

$ echo \echo onfranzr |tr a-z n-za-m` `echo
$SHELL` echo fhpxf |`which tr` a-z n-za-m`!

Ich bin beeindruckt! Koenntest Du vielleicht mal noch was
huebsches mit 3 Verschachtelungen basteln?

Ja, koennte ich. Ich hab aber Angst, dass Du das einfach so ausfuehren koenntest und mir „aus Versehen“ ein ‚rm -rf $HOME‘ dazwischenrutscht.

Naja, kann ja zum Glueck jeder selber entscheiden, welches der
beiden Code-Fragmente er nach 2 Wochen noch besser versteht…
:wink:

$ echo $($(echo onfranzr|$(which tr) a-z n-za-m) $(echo
$SHELL)) $(echo fhpxf|$(which tr) a-z n-za-m)

Waeren wir jetzt woanders, wuerde man Dich und Deinen bashism mit dem Pruegel der Portabiltitaet zum Teufel jagen. Hier kannst Du das machen, wie Du willst.

Gruss vom Frank.

Hi Frank,

Ja, koennte ich. Ich hab aber Angst, dass Du das einfach so
ausfuehren koenntest und mir „aus Versehen“ ein ‚rm -rf $HOME‘
dazwischenrutscht.

Fuer den Fall das ich in einem Anflug von Spontanitaet so etwas Unvorsichtiges tue habe ich im Zweifelsfall noch ein Backup, also trau Dich :wink:

Naja, kann ja zum Glueck jeder selber entscheiden, welches der
beiden Code-Fragmente er nach 2 Wochen noch besser versteht…
:wink:

$ echo $($(echo onfranzr|$(which tr) a-z n-za-m) $(echo
$SHELL)) $(echo fhpxf|$(which tr) a-z n-za-m)

Waeren wir jetzt woanders, wuerde man Dich und Deinen bashism
mit dem Pruegel der Portabiltitaet zum Teufel jagen. Hier
kannst Du das machen, wie Du willst.

Ja, kann ich, zumal ich darauf hingewiesen habe, dass man derlei „boese Sachen“ machen kann, wenn man die Bash verwendet. Fuer Thomas ist es am Anfang IMHO besser, leserlichen Code zu haben, um ueberhaupt zu verstehen was er da macht, und da erschien es mir eben wichtig ihm auch die Sache mit den geklammerten Sub commands mitzugeben. Mein Statement , dass mit den Backticks keine Verschachtelungen moeglich sind war allerdings so wie ich es geschrieben habe falsch.

Portabilitaet ist sicherlich auch in meinen Augen ein wichtiger Punkt und ich (sowie sicherlich auch die anderen interessierten Leser) danke Dir auch fuer das schoene Beispiel mit den maskierten Backticks (auch wenn Du offensichtlich eine andere Shell als die Bash bevorzugst :wink: ).

Gruesse ins Sachsenland
micha

also trau Dich :wink:

Noe. Da kommst Du selbst drauf. Hint: Du brauchst nur \ und ` dafuer. Ggf. kann man mit ’ oder " wuerzen.

Fuer Thomas ist es am Anfang IMHO besser, leserlichen Code
zu haben, um ueberhaupt zu verstehen was er da macht,

Thomas scheint mir kein besonders grosses Interesse am Verstehen zu haben. YMMV.

Mein Statement , dass mit den Backticks keine
Verschachtelungen moeglich sind war allerdings so wie ich
es geschrieben habe falsch.

Genau darauf wollte ich hinweisen. Nicht mehr und nicht weniger.

(auch wenn Du offensichtlich eine
andere Shell als die Bash bevorzugst :wink: ).

Ich bin ueberzeugt, dass es bessere Shells als die bash gibt. Geruechten zufolge soll es sogar einen besseren Editor als vi geben. Und das querty-Tastaturlayout ist nicht gerade optimal. Aber die Lernschwelle und die Umstellung… doch es schadet nicht, gelegentlich mal ueber den Tellerrand zu schauen.

Gruss vom Frank.

Hallo Frank,

tja, Copy und Paste ist nicht, da ich es an einem Server ohne jegliche grafische Oberfläche benötige und dort somit auch kein Internet zum Herauskopieren zur Verfügung hatte. Da mit dem richtig abschreiben, muß ich Dir leider Recht geben. Allerdings war auf meinem Ausdruck dann 1 und l nicht zu unterscheiden und da ich ehrlich gestanden bei Linux gerade einmal so am Anfang stehe, ist das mit dem Verstehen auf die Schnelle auch nicht ganz so einfach.

Eine Frage bleibt aber noch…

Kann es sein, daß ich eine Fehlermeldung bekomme, wenn ich nach dem find einen konkreten Dateinamen angebe und die Datei nicht existiert, oder habe ich da schon wieder etwas falsch gemacht?

Gruß

Thomas

Hallo Ihr beiden,

Fuer Thomas ist es am Anfang IMHO besser, leserlichen Code
zu haben, um ueberhaupt zu verstehen was er da macht,

Thomas scheint mir kein besonders grosses Interesse am
Verstehen zu haben. YMMV.

müsstet Ihr Euch wie ich bei uns im Betrieb mit 5 verschiedenen Betriebssystemen herumschlagen, wobei ich die verschiedenen Windowsversionen hier nur als ein Betriebssystem gezählt habe. Alleine die Feinheiten zwischen Unix und Linux sind schon eine Sache für sich. Um Kommandos in dieser verschachtelten Art auch nur halbwegs durchblicken zu können, dazu fehlt mir leider eine ganze Menge Hintergrundwissen.

Gruß

Thomas

Hallo Micha,

entsprechenden schliessenden eckigen Klammer nach dem „-gt 1“

wofür steht denn dieses „-gt 1“? Müßte das nicht „-gt 0“ heißen? bei „-gt 1“ müssten es ja mindestens 2 Dateien sein, oder verstehe ich da etwas falsch?

Gruß

Thomas

Hallo Thomas,

tja, Copy und Paste ist nicht, da ich es an einem Server ohne
jegliche grafische Oberfläche benötige und dort somit auch
kein Internet zum Herauskopieren zur Verfügung hatte.

Wie administriert ihr Eure *X Kisten? Unter Umstaenden ist es sogar sinnvoll, wenn aus Sicherheitsaspekten möglich, sshd auf den Kisten laufen zu lassen, dann koenntest Du von Deiner Workstation aus sowohl auf die *X Kisten zugreifen, als auch im Internet surfen und dann copy & paste machen…

Kann es sein, daß ich eine Fehlermeldung bekomme, wenn ich
nach dem find einen konkreten Dateinamen angebe und die Datei
nicht existiert, oder habe ich da schon wieder etwas falsch
gemacht?

Du hast nix falsch gemacht, bei einem konkreten Dateinamen bekommst Du dann tatsaechlich eine Fehlermeldung, allerdings sollte das keinen Einfluss auf Deine „If“-Abfrage haben. Wenn Du die Fehlermeldung gern unterdruecken moechtest kannst Du den stderr nach /dev/null umleiten, also sowas wie:

$ if [$(find hello 2\>/dev/null|wc -l) -gt 0] ; then echo "gefunden";fi

hth
micha

Hallo Thomas,

entsprechenden schliessenden eckigen Klammer nach dem „-gt 1“

wofür steht denn dieses „-gt 1“? Müßte das nicht „-gt 0“
heißen? bei „-gt 1“ müssten es ja mindestens 2 Dateien sein,
oder verstehe ich da etwas falsch?

depends:
wenn Du nach einer konkreten Datei suchst ist „0“ die richtige Loesung, wenn Du alle Dateien in einem Verzeichnis suchst, dann ist z.B. „.“ ein Eintrag, obwohl keine Datei in dem Sinne den wir meinen vorhanden ist…in diesem Fall ist dann die „1“ richtig.

gt entspr. greater than

hth
micha