Shell Programmierung mit logischen Operatoren

I.MC

Watt soll denn hier hin?
Hi!

Ich versuche was ganz einfach zu erstellen, kann man nicht einmal programmieren nennen. Ich möche einfach in einem gewissen Verzeichnis alle Dateien und Ordner (sofern da nicht noch jüngere Dateien drin sind) nach X-Tagen löschen per cron.

Der Befehl sollte so ähnlich gehen wie:

Code:
find /Pfad -mtime +X-TAGE -exec "test -d {} && rmdir {} || rm {}" \;

Funktioniert aber nicht, da rm dann die Dateien als nicht vorhanden deklariert. Zudem interessiert mich wie hier die logischen Operatoren zu verstehen sind!

&& = logischen UND?
|| = logischen Oder?

Gruß, incmc
 
incmc schrieb:
Hi!

Ich versuche was ganz einfach zu erstellen, kann man nicht einmal programmieren nennen. Ich möche einfach in einem gewissen Verzeichnis alle Dateien und Ordner (sofern da nicht noch jüngere Dateien drin sind) nach X-Tagen löschen per cron.

Der Befehl sollte so ähnlich gehen wie:

Code:
find /Pfad -mtime +X-TAGE -exec "test -d {} && rmdir {} || rm {}" \;
versuch es doch testweise erstmal mit echo.
Funktioniert aber nicht, da rm dann die Dateien als nicht vorhanden deklariert. Zudem interessiert mich wie hier die logischen Operatoren zu verstehen sind!

&& = logischen UND?
|| = logischen Oder?

Gruß, incmc

jop, das stimmt.

wenn dir die syntax mit && und || nicht so zusagt, kannst du das ganze auch mit if schreiben, was imo übersichtlicher ist.
 
Das ist mir nicht verständlich mit den beiden hier genutzen Operatoren. D.h. jetzt, die Option exec ist auf darauf aus, die logisch Verknüpfung wahr werden zu lassen? Heisst, wenn der erste UND Bereich war wird, dann wird die ODER Verknüpfung gar nicht mehr ausgeführt?

Gruß, incmc
 
Code:
find /Pfad -mtime +X-TAGE -exec "test -d {} && rmdir {} || rm {}" \;

So macht das wenig Sinn. Du rufst weder die Shell auf, noch ist sie der richtige Ort fuer sowas. Ausserdem ist es sowieso ueberfluessig.
Von Sonderzeichen mal ganz zu schweigen.

Code:
find -d /Pfad -mtime +X-TAGE -exec rm -d {} \;
 
In meinen Augen dürfte das ebenfalls nicht funktionieren, da 'rm -d' doch Verzeichnisse nicht löscht, wenn sie nicht leer sind. Ansonsten erfreue ich mich jeder ausführlicheren Antwort als, dass das sowieso überflüssig ist. Das hilft keinem weiter und ist somit ebenfalls überlüssig...

Gruß, incmc
 
Du willst fuer jedes File eine Subshell ausfuehren, in der du nur Konditionen testest. Lese dir am besten mal find(1) durch, und ueberlege, was die ganzen Befehle machen. Was passiert bei "find / -exec true" und "find / -exec false"?

Deine urspruengliche Version loeschte auch keine Verzeichnisse, solange sie nicht leer sind. Willst du das denn ueberhaupt? Desweiteren musst du ein Depth-First-Traversal machen, sonst macht das loeschen ebenso wenig Sinn.
 
Ich hab das jetzt nicht getestet:
Code:
find /Pfad -mtime +X-TAGE -exec "test -d {} && rmdir {} || rm {}" \;
ich hätte aber auch nicht erwartet, dass es klappt, denn auf der Shell wird das logische UND so ausgewertet:
Code:
befehl 1 && befehl 2

führe befehl 2 nur dann aus, wenn befehl 1 erfolgreich ausgeführt wurde und
rmdir <dateiname> || rm <dateiname>
ist IMHO kein gültiges shellkommando

Mein Vorschlag:
Code:
      1 #!/bin/sh
      2 
      3 for file in `find [U]/Pfad[/U] -mtime +[U]n Tage[/U]`
      4 do
      5     rm -r $file
      6 done

oder
Code:
      1 #!/bin/sh
      2 
      3 for file in `find $1 -mtime +$2`
      4 do
      5     rm -r $file
      6 done
Aufruf dann:
clean_up Pfad n
wobei clean_up der Skriptname und n die Zahl der Tage ist.
 
Das kann so wie oben auch nicht gehen, da exec nicht die Shell involviert. Daher wirken die Operatoren hier so nicht. Ich habe es im Endeffekt bequemer gelöst mittels xargs... :-)

Gruß, incmc
 
incmc schrieb:
Das kann so wie oben auch nicht gehen, da exec nicht die Shell involviert. Daher wirken die Operatoren hier so nicht. Ich habe es im Endeffekt bequemer gelöst mittels xargs... :-)

Gruß, incmc

Das Shellskript funktioniert, wo Du da allerdings eine exec siehst, weiss ich nicht ;)
 
Ich meinte die allererste Version, den Einzeiler... nicht das Skript.

Gruß, incmc
 
soweit ich jetzt sehe, fehlt zum Einen das schließende " (kann vorkommen ;)) und zum Anderen werden nur Verzeichnise gelöscht, keine Dateien.
Was passiert, wenn das Verzeichnis nicht leer weiß ich nicht.
Müsste man testen.

---
[edit]
hm - bei mir funktioniert es so gar nicht :(

[nochmal edit]
find /Pfad -mtime +X-TAGE -exec test -d {} -delete \;
würde passende Verzeichnisse löschen, aber nur, wenn sie leer sind.
-----
geht nicht einfach?
anscheinend nicht so einfach, wie Du denkst ;)
 
Zuletzt bearbeitet:
Warum weigert ihr euch eigentlich mal einen Blick in find(1) zu werfen? Die einfachste Loesung ist immer noch
Code:
find /path -mtime +X -delete
Fuer den Verzeichnisstest jedes mal einen Prozess zu forken ... also nein :rolleyes:
 
Zu der delete Option: Was passiert denn dann wenn er ein Verzeichnis findet.. darüber schweigt sich die man page aus. Ich weiss nicht genau was mit "Depth-first traversal processing is implied by this option" gemeint ist. Denke, es fängt mit dem tiefsten Punkt in dem Pfad an.

incmc
 
incmc schrieb:
Zu der delete Option: Was passiert denn dann wenn er ein Verzeichnis findet.. darüber schweigt sich die man page aus.
-delete
Delete found files and/or directories. ...

Die werden ebenfalls gelöscht
Ich weiss nicht genau was mit "Depth-first traversal processing is implied by this option" gemeint ist. Denke, es fängt mit dem tiefsten Punkt in dem Pfad an.

incmc

Ja, denk? ich auch.
-d The -d option causes find to perform a depth-first traversal,
i.e., directories are visited in post-order and all entries in a
directory will be acted on before the directory itself.


-delete löscht übrigens keine Verzeichnisse in denen Dateien liegen.
Es sei denn, diese werden ebenfalls gelöscht.

ach und nochwas:
Mit find lässt sich auch ohne "-exec test ..." der Dateityp feststellen:

-type t
True if the file is of the specified type. Possible file types
are as follows:

b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket


Der Hinweis von MrFixIt war durchaus berechtigt!
 
Zuletzt bearbeitet:
Wenn ich alle wisst, dass -delete nicht das Verzeichnis löscht wenn noch was drin ist.... dann ist das ja supi -> geht so, gut gut!

Gruß, incmc
 
Zurück
Oben