Hallo ich möchte aus einem Verzeichnis Dateien auf die länger als 30 Tage nicht mehr zugegriffen wurden löschen. Das ist kein Problem mit find, aber ich muss aus dem Verzeichnis bestimmte Dateien und Unterverzeichnisse excluden. Eine Excludefunktion habe ich bei find nicht gefunden. Also dachte ich mir ich greppe mir mit -v alles raus was nicht gelöscht werden darf, schiebe es in eine Datei und durch- laufe das Ganze dann mit eine for-Schleife. Leider sind in den Dateinamen Leerzeichen und schon klappts nicht mehr mit der for-Schleife: #find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE # #for i in `cat /tmp/LISTE`; do # echo $i # rm -rf $i #done Weiss jemand wie ich im find etwas exluden kann und damit dann -exec verwenden kann ? Oder wie kann ich mit for etwas einlesen, was Leerzeichen enthält und diese nicht als einzelne Variablen ausgeben ? -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Am Dienstag, 1. August 2006 11:22 schrieb Jens Strohschnitter:
Hallo
ich möchte aus einem Verzeichnis Dateien auf die länger als 30 Tage nicht mehr zugegriffen wurden löschen. Das ist kein Problem mit find, aber ich muss aus dem Verzeichnis bestimmte Dateien und Unterverzeichnisse excluden. Eine Excludefunktion habe ich bei find nicht gefunden. Also dachte ich mir ich greppe mir mit -v alles raus was nicht gelöscht werden darf, schiebe es in eine Datei und durch- laufe das Ganze dann mit eine for-Schleife. Leider sind in den Dateinamen Leerzeichen und schon klappts nicht mehr mit der for-Schleife:
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE # #for i in `cat /tmp/LISTE`; do # echo $i # rm -rf $i #done
Weiss jemand wie ich im find etwas exluden kann und damit dann -exec verwenden kann ? Oder wie kann ich mit for etwas einlesen, was Leerzeichen enthält und diese nicht als einzelne Variablen ausgeben ?
statt der for-Schleife ein while-Schleife benutzen, dann geht's auch mit Leerzeichen find .... | while read l ; do .... $l ....; done Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer, Dienstag, 1. August 2006 11:35:
find .... | while read l ; do .... $l ....; done
Kippelig. Denn wenn $I Leerzeichen enthält, würde zB folgendes dastehen: ...; do rm meine datei mit leerzeichen; done Das schlägt fehl. Besser: ...; do ..."$I"...; done Dies würde zu ...; do rm "meine datei mit leerzeichen"; done Dann klappts auch. -- Andre Tann
Dr. Jürgen Vollmer, Dienstag, 1. August 2006 11:35:
find .... | while read l ; do .... $l ....; done
Kippelig. Denn wenn $I Leerzeichen enthält, würde zB folgendes dastehen:
...; do rm meine datei mit leerzeichen; done
Das schlägt fehl. Besser:
...; do ..."$I"...; done
Dies würde zu
...; do rm "meine datei mit leerzeichen"; done
Dann klappts auch.
Hi perfekt. Das mit der while-Schleife hat prima geklappt. Danke. -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hallo, Am Die, 01 Aug 2006, Dr. Jürgen Vollmer schrieb:
Am Dienstag, 1. August 2006 11:22 schrieb Jens Strohschnitter: statt der for-Schleife ein while-Schleife benutzen, dann geht's auch mit Leerzeichen
find .... | while read l ; do .... $l ....; done
Bitte | while read -r f; do ... "$f" ... ; done ^^ ^ ^ verwenden. -dnh -- Wer News über ein Webinterface liest, filmt auch die Tageszeitung, um sie auf dem Fernseher anzuschauen. (Henning Schlottmann)
Am Dienstag, 1. August 2006 20:32 schrieb David Haller:
Hallo,
Am Die, 01 Aug 2006, Dr. Jürgen Vollmer schrieb:
Am Dienstag, 1. August 2006 11:22 schrieb Jens Strohschnitter: statt der for-Schleife ein while-Schleife benutzen, dann geht's auch mit Leerzeichen
find .... | while read l ; do .... $l ....; done
Bitte
| while read -r f; do ... "$f" ... ; done
^^ ^ ^ verwenden.
Warum? (Ich bin mal wieder neugierig.) Die man-page sagt: -r Backslash does not act as an escape charac ter. The backslash is considered to be part of the line. In particular, a backslash- newline pair may not be used as a line con tinuation. So weit, so gut, aber ein Backslash sollte doch im Normalfall nicht in Dateinamen vorkommen. Oder habe ich etwas anderes nicht bedacht? Gruß, Achim
Hallo, Am Die, 01 Aug 2006, Achim Schäfer schrieb:
Am Dienstag, 1. August 2006 20:32 schrieb David Haller:
Am Die, 01 Aug 2006, Dr. Jürgen Vollmer schrieb:
Am Dienstag, 1. August 2006 11:22 schrieb Jens Strohschnitter: statt der for-Schleife ein while-Schleife benutzen, dann geht's auch mit Leerzeichen
find .... | while read l ; do .... $l ....; done
Bitte
| while read -r f; do ... "$f" ... ; done
^^ ^ ^ verwenden.
Warum? (Ich bin mal wieder neugierig.)
Weil. Immer. Eigentlich sollte man auch gleich noch IFS leeren: | while IFS='' read -r x; do ... [..]
So weit, so gut, aber ein Backslash sollte doch im Normalfall nicht in Dateinamen vorkommen. Oder habe ich etwas anderes nicht bedacht?
Via Escapesequenzen kann man dir was unterjubeln. Und in Dateinamen sind[1] unter Linux nur '/' und ASCII 0 (\0) verboten. Vergleiche z.B.: echo 'a\007b' | while read x; do echo "$x"; done echo 'a\007b' | while read -r x; do echo "$x"; done Wenn Escapesequenzen im Dateinamen vorkommen willst du die auch im $x haben (ein 'File not found' waere noch die angenehmste Nebenwirkung). Und das Quoten der eingelesenen Variable ist sowieso Pflicht. -dnh [1] ausser weiteren Einschraenkungen durch das Dateisystem, auf FAT u.a. Backslash und Doppelpunkt... -- It took us fifteen years and three supercomputers to MacGyver a way to power the gate. -- Samantha Carter, Stargate
Hallo, 2006-08-01 11:22 +0200, Jens Strohschnitter:
Hallo
ich möchte aus einem Verzeichnis Dateien auf die länger als 30 Tage nicht mehr zugegriffen wurden löschen. Das ist kein Problem mit find, aber ich muss aus dem Verzeichnis bestimmte Dateien und Unterverzeichnisse excluden. Eine Excludefunktion habe ich bei find nicht gefunden. Also dachte ich mir ich greppe mir mit -v alles raus was nicht gelöscht werden darf, schiebe es in eine Datei und durch- laufe das Ganze dann mit eine for-Schleife. Leider sind in den Dateinamen Leerzeichen und schon klappts nicht mehr mit der for-Schleife:
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE
Wie wäre es mit: find /test -mtime +30 -type f -print | sed '/Exclude1/d' | sed '/Exclude2/d' | sort -u > /tmp/LISTE Gruß Kimmo
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE # #for i in `cat /tmp/LISTE`; do # echo $i # rm -rf $i #done
An und für sich klappt das ja. Von daher noch ein anderer Ansatz: Ersetze doch vor der Umleitung in /tmp/LISTE alle Leerzeichen durch mit einem Backslash entwertete Leerzeichen. Also eine weitere pipe mit sed 's/ /\\\ /g' Grüße Dominik
On Tuesday 01 August 2006 11:22, Jens Strohschnitter wrote:
Hallo
ich möchte aus einem Verzeichnis Dateien auf die länger als 30 Tage nicht mehr zugegriffen wurden löschen. Das ist kein Problem mit find, aber ich muss aus dem Verzeichnis bestimmte Dateien und Unterverzeichnisse excluden. Eine Excludefunktion habe ich bei find nicht gefunden. Also dachte ich mir ich greppe mir mit -v alles raus was nicht gelöscht werden darf, schiebe es in eine Datei und durch- laufe das Ganze dann mit eine for-Schleife. Leider sind in den Dateinamen Leerzeichen und schon klappts nicht mehr mit der for-Schleife:
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE # #for i in `cat /tmp/LISTE`; do # echo $i # rm -rf $i #done
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE # #for i in `cat /tmp/LISTE`; do # echo "$i" # rm -rf "$i" #done anfuehrungszeichen koennten helfen.
Weiss jemand wie ich im find etwas exluden kann und damit dann -exec verwenden kann ? Oder wie kann ich mit for etwas einlesen, was Leerzeichen enthält und diese nicht als einzelne Variablen ausgeben ?
-- Regards,
Jens Strohschnitter
greets Michael
Am Dienstag, 1. August 2006 11:22 schrieb Jens Strohschnitter:
Eine Excludefunktion habe ich bei find nicht gefunden.
[...]
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE
Hallo Jens, ich habe auch noch einen Vorschlag. Das ganze kannst Du auch direkt mit find erledigen. Das kann durchaus mit logischen Operatoren arbeiten. (Siehe 'man find'.) Du könntest also so etwas schreiben (ungetestet): find /test ! -name "*Exclude1*" ! -name "*Exclude2*" -mtime +30 -type f und dann muss dahinter zum Löschen natürlich noch ein: -exec rm -fr {} \; oder besser noch: -print0 | xargs -0 rm -fr Gruß, Achim
Am Dienstag, 1. August 2006 11:22 schrieb Jens Strohschnitter:
Eine Excludefunktion habe ich bei find nicht gefunden.
[...]
#find /test -mtime +30 -type f -print | grep -v Exclude1 | grep -v Exclude2 | cut -f2 -d\/ | sort -u > /tmp/LISTE
Hallo Jens,
ich habe auch noch einen Vorschlag. Das ganze kannst Du auch direkt mit find erledigen. Das kann durchaus mit logischen Operatoren arbeiten. (Siehe 'man find'.)
Du könntest also so etwas schreiben (ungetestet):
find /test ! -name "*Exclude1*" ! -name "*Exclude2*" -mtime +30 -type f
und dann muss dahinter zum Löschen natürlich noch ein: -exec rm -fr {} \;
oder besser noch: -print0 | xargs -0 rm -fr
Hallo das sieht ja sauber aus. Probier ich gleich mal aus. Danke. -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hallo, Am Die, 01 Aug 2006, Achim Schäfer schrieb:
ich habe auch noch einen Vorschlag. Das ganze kannst Du auch direkt mit find erledigen. Das kann durchaus mit logischen Operatoren arbeiten. (Siehe 'man find'.)
Du könntest also so etwas schreiben (ungetestet):
find /test ! -name "*Exclude1*" ! -name "*Exclude2*" -mtime +30 -type f
Die '!' muss man quoten oder escapen. => History expansion. find /test -type f -mtime +30 -not -name '*foo*' -not -name '*bar*'
und dann muss dahinter zum Löschen natürlich noch ein: -exec rm -fr {} \; oder besser noch: -print0 | xargs -0 rm -fr
Das '-r' ist glaube ich nicht gewollt. -print0 | xargs -r -0 rm -f Der Vollstaendigkeit halber: die anderen "Loesungen" mit sed sind allesamt anfaellig bist falsch. Uebrigens kann man mit Perl Schwierigkeiten auch umgehen. Mit 'find2perl' gibt's sogar Hilfe ;) Gleich angepasst und um die Excludes ergaenzt: ==== #!/usr/bin/perl -w use strict; use File::Find; sub wanted { -f _ ### -type f && (int(-M _) > 30) ## -mtime +30 && ! m/EXCLUDE_REGEX_ONE/ && ! m/EXCLUDE_REGEX_TWO/ && unlink($File::find::name); ### rm -f } # Traverse desired filesystems File::Find::find({wanted => \&wanted}, '.'); exit(0); ==== -dnh --
Womit erstellt ihr so eure Homepages? mit vim *g*. Wobei es Leute gibt, die tatsächlich behaupten, das soll auch mit diesem Betriebssystem - wie heißt es doch gleich - *äh* Emacs gehen. [> Bernd Stäglich und Philipp Zacharias in suse-linux]
Am Dienstag, 1. August 2006 20:53 schrieb David Haller:
Du könntest also so etwas schreiben (ungetestet):
find /test ! -name "*Exclude1*" ! -name "*Exclude2*" -mtime +30 -type f
Die '!' muss man quoten oder escapen. => History expansion.
OK. Aber dafür müsste schon ein Befehl mit - beginnen. Aber besser ist dann wohl die "-not" Form.
find /test -type f -mtime +30 -not -name '*foo*' -not -name '*bar*'
und dann muss dahinter zum Löschen natürlich noch ein: -exec rm -fr {} \; oder besser noch: -print0 | xargs -0 rm -fr
Das '-r' ist glaube ich nicht gewollt.
Das war in Jens Beispiel in der ersten Mail auch schon drin, deshalb habe ich es übernommen. Aber Du hast Recht: Insbesondere zusammen mit dem "-type f" ist das nicht sinnvoll. Gruß, Achim
participants (8)
-
Achim Schäfer
-
Andre Tann
-
David Haller
-
Dominik Klein
-
Dr. Jürgen Vollmer
-
Jens Strohschnitter
-
K. Elo
-
Michael Skibbe