Findbefehl zum Erstellen von Löschlisten
Hallo weiss jemand wie man über den Findbefehl eine Liste von Dateien erzeugt (inkl. Pfadangaben) die eine bestimmte Dateiendung haben ? Also ich möchte ab einem bestimmten Verzeichnis alle Dateien auflisten die eine (Windows)-Endung wie z.B. .exe, .bat, .pif usw. haben und diese wenn möglich auch gleich löschen. Ich kenne das Kommando: find /PATH/ -mtime +30 -type f -print -exec rm {} \; Aber wie übergabe ich find nun die Liste mit den Endungen ? -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun ------------------------------------- __________________________________________________________ Raiffeisen Waren-Zentrale Rhein-Main eG 50668 Koeln, Altenberger Str. 1a Tel: 0221/1638-0 Fax: 0221/1638-254 Sitz: Koeln Amtsgericht Koeln, GnR 728 Vorstand: Hans-Josef Hilgers (Sprecher) Markus Stuettgen Dr. Karl-Heinrich Suemmermann Friedhelm Decker Ingo Steitz Vorsitzender des Aufsichtsrates: Peter Bleser (MdB) St.Nr.: 215/5938/0152 Bankverbindung: WGZ Bank AG, Duesseldorf (BLZ 300 600 10) Konto-Nr.: 300 011 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Dienstag, 27. Februar 2007 schrieb Jens Strohschnitter:
find .... -print0 -name "*.exe" -o -name "*.bat" ... | xargs -0 rm -f - das mit dem xargs sorgt dafür daß nicht für jede gefunden Datei "rm" aufgerufen wird ==> schneller - -print0 ==> kann auch Blanks in Dateinamen verarbeiten Bye 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
Hi das klappt ja prächtig. Danke. __________________________________________________________ Raiffeisen Waren-Zentrale Rhein-Main eG 50668 Koeln, Altenberger Str. 1a Tel: 0221/1638-0 Fax: 0221/1638-254 Sitz: Koeln Amtsgericht Koeln, GnR 728 Vorstand: Hans-Josef Hilgers (Sprecher) Markus Stuettgen Dr. Karl-Heinrich Suemmermann Friedhelm Decker Ingo Steitz Vorsitzender des Aufsichtsrates: Peter Bleser (MdB) St.Nr.: 215/5938/0152 Bankverbindung: WGZ Bank AG, Duesseldorf (BLZ 300 600 10) Konto-Nr.: 300 011 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi also wenn ich den Befehl so ausführe, bekomme ich alle Dateien im Verzeichnis angezeigt: find . -print0 -iname "*.exe" | xargs -0 ls (ls zum anzeigen statt zu löschen) Oder würde der rm-Befehl dann sich die Files mit .exe raussuchen ? -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun ------------------------------------- __________________________________________________________ Raiffeisen Waren-Zentrale Rhein-Main eG 50668 Koeln, Altenberger Str. 1a Tel: 0221/1638-0 Fax: 0221/1638-254 Sitz: Koeln Amtsgericht Koeln, GnR 728 Vorstand: Hans-Josef Hilgers (Sprecher) Markus Stuettgen Dr. Karl-Heinrich Suemmermann Friedhelm Decker Ingo Steitz Vorsitzender des Aufsichtsrates: Peter Bleser (MdB) St.Nr.: 215/5938/0152 Bankverbindung: WGZ Bank AG, Duesseldorf (BLZ 300 600 10) Konto-Nr.: 300 011 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Dienstag, 27. Februar 2007 schrieb Jens Strohschnitter:
da das obiges find-Kommando gibt auch Verzeichnisse aus, und damit gibt ls auch den Inhalt dieser Verzeichnisse aus. Das ist aber nicht das Problem. Es macht einen Unterschied ob man: find . -print0 -iname "*.exe" oder find . -iname "*.exe" -print0 schreibt. Es muß am Ende stehen. Steht es am Anfang, dann wird alles ausgegeben. Warum das so ist kann ich nicht sagen (bug? GNU find Version 4.2.28) Bye 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
Hallo, Am Die, 27 Feb 2007, Dr. Jürgen Vollmer schrieb:
Feature. Man denke an Konstruktionen wie: find . -print -iname '*.txt' -exec md5sum {} \; find . -print -iname '*.txt' -exec sh -xc "ls -b '{}' >&2" -- sh \; die ansonsten nicht möglich wären. IMO steht das auch irgendwie in der manpage, aber wohl mehr oder weniger nur implizit... -dnh -- 132: Plug and Play Kondome. (Rolf Siebrecht) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Dienstag, 27. Februar 2007 schrieb David Haller:
IMO steht das auch irgendwie in der manpage, aber wohl mehr oder weniger nur implizit...
hab' auf den ersten Blick nichts gefunden. Bye 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
Hallo, Am Mit, 28 Feb 2007, Dr. Jürgen Vollmer schrieb:
Aber das -iname spielt eine Rolle für nachfolgende "Actions", hier das 'exec'. Probier's mit der md5sum-Variante: Ausgeben werden alle Dateien, md5-Summen werden aber nur von *.txt Dateien generiert.
Zumindest teilweise implizit in der Beschreibung von EXPRESSION. Ja, ist wüst. -dnh -- 74: Datenautobahnen ... sind Ländersache (Helmut Kohl) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller wrote:
Hi, wenn nicht explizit anders angegeben, werden die Anweisungen mit _und_ verknüpft, im Klartext: die zweite Anweisung wird nur ausgeführt, wenn die erste ein true zurückgab. Und so die folgenden. Wenn Du vorne "-print" hast, wird erst "-print" ausgeführt -und ist true, d.h. es wird angezeigt und gleichzeitig die nächste Anweisung ausgeführt... andersrum: wenn vorne -name "*.exe" steht werden nur die an die nächste Anweisung übergeben, die das erfüllen... Man kann das ändern, indem man die Teile mit -o (exklusives oder) verknüpft. Eigentlich ist die manpage unter OPERATORS hier recht eindeutig... gruß jörg -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mittwoch, 28. Februar 2007 schrieb Joerg Thuemmler:
ach jetzt wird's klarer. Das Urprungsproblem (es werden alle Dateien verarbeitet) tritt dann im Zusammenhang mit xargs auf. find ... -print -name "*.exe" | xargs cmd ==> alle gefundenen Namen werden an cmd übergeben, da xargs ja die Ausgabe (-print) erzeugt. -name liefert zwar für manche Dateien "false", aber das "juckt" xargs nicht find ... -print -name "*.exe" -exec cmd {} \; ==> es werden wieder alle Dateien ausgegeben (-print) aber da -name für manche Dateien fehlschlägt, wird für diese Dateien -exec nicht mehr ausgeführt. Man lernt nie aus. Bye 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
Hallo, Am Mit, 28 Feb 2007, Dr. Jürgen Vollmer schrieb:
Genau. [..]
Genauer: es juckt das -print davor nicht, was also den Dateinamen ausgibt und der wird dann also per Pipe an xargs verfüttert. Das -name '*.exe' kann man in diesem Beispiel also komplett weglassen ;) Das ist analog zu: find ... [-true -and] -print(=true) -and -name '*.exe' -and -print | xargs
Genau. Klarer: das -exec wird nur für die Dateien ausgeführt, für die das -name true liefert.
Man lernt nie aus.
ACK! -dnh -- The duke had a mind that ticked like a clock and, like a clock, it regularly went cuckoo. -- (Terry Pratchett, Wyrd Sisters) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hier nochmal die Ausgabe von find. Ein Test mit rm brachte den Erfolg, dass alle Dateien aus allen Verzeichnissen gelöscht wurden: # find . -print0 -name "*.exe" | xargs -0 ls ./test123/test.1233 ./test123/test.exe ./test456/file.com ./test456/file.txt ./test123/test.abc ./test456/file.bat ./test456/file.doc ./test456/file.xls .: test123 test456 ./test123: test.1233 test.abc test.exe ./test456: file.bat file.com file.doc file.txt file.xls -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun ------------------------------------- __________________________________________________________ Raiffeisen Waren-Zentrale Rhein-Main eG 50668 Koeln, Altenberger Str. 1a Tel: 0221/1638-0 Fax: 0221/1638-254 Sitz: Koeln Amtsgericht Koeln, GnR 728 Vorstand: Hans-Josef Hilgers (Sprecher) Markus Stuettgen Dr. Karl-Heinrich Suemmermann Friedhelm Decker Ingo Steitz Vorsitzender des Aufsichtsrates: Peter Bleser (MdB) St.Nr.: 215/5938/0152 Bankverbindung: WGZ Bank AG, Duesseldorf (BLZ 300 600 10) Konto-Nr.: 300 011 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Die, 27 Feb 2007, Dr. Jürgen Vollmer schrieb:
Ist aber arg nervig zum eintippen... Je nach Datenlage ist ein find ... -type f -print0 | tr '\n\0' '\0\n' \ | egrep -i '\.(exe|com|scr|dll|bat|cmd|pif)$' \ | tr '\n\0' '\0\n' | xargs -0 ls -b1 Das kommt sogar mit Dateinamen klar (zumindest bei einem kurzen Test mit "kranken Dateinamen") in denen u.a. Leerzeichen, Zeilenumbrüche, Backslashes und Anführungszeichen (' und ") vorkommen. ;) Statt dem 'ls' dann eben 'rm -f' einfügen. Ne Perl-Lösung wäre aber wohl am robustesten und am einfachsten zu tippen. perl -we 'use strict; use File::Find; find( { wanted => sub { m/\.(exe|com|scr|dll|bat|cmd|pif|txt)$/ and print "$_\n"; }, no_chdir => 1 }, ".");' Statt dem 'and print "$_\n";' zum Löschen dann 'and unlink($_);' verwenden. Verwendet man statt "." als zweites Argument des 'find'-Befehls ein @ARGV (also find( { wanted => sub { ... }, no_chdir => 1 }, @ARGV ) werden alle auf der Kommandozeile übergebenen Verzeichnisse durchsucht. Siehe auch 'perldoc File::Find'. HTH, -dnh --
Hi super! Das hat prima geklappt. Danke an alle ;-) -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun ------------------------------------- __________________________________________________________ Raiffeisen Waren-Zentrale Rhein-Main eG 50668 Koeln, Altenberger Str. 1a Tel: 0221/1638-0 Fax: 0221/1638-254 Sitz: Koeln Amtsgericht Koeln, GnR 728 Vorstand: Hans-Josef Hilgers (Sprecher) Markus Stuettgen Dr. Karl-Heinrich Suemmermann Friedhelm Decker Ingo Steitz Vorsitzender des Aufsichtsrates: Peter Bleser (MdB) St.Nr.: 215/5938/0152 Bankverbindung: WGZ Bank AG, Duesseldorf (BLZ 300 600 10) Konto-Nr.: 300 011 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, On Tuesday 27 February 2007 21:03:14 David Haller wrote:
Und was haelst du von: find ... -regextype posix-egrep \ -iregex '.*\.(exe|com|scr|dll|bat|cmd|pif)' \ -type f \ -exec ls -b1 {} \+ oder auch mit Emacs regexp: find ... -iregex '.*\.\(exe\|com\|scr\|dll\|bat\|cmd\|pif\)' \ -type f \ -exec ls -b1 {} \+ Roman -- Roman Fietze Telemotive AG Büro Mühlhausen
Hallo, Am Mit, 28 Feb 2007, Roman Fietze schrieb:
Teilweise viel, -[i]regex war mit komplett entfallen. Aber immerhin gibt's -[i]regex nicht überall (s.u.) *rausred* ;)
find ... -regextype posix-egrep \
$ find -regextype find: invalid predicate `-regextype' $ find --version GNU find version 4.1
-iregex '.*\.(exe|com|scr|dll|bat|cmd|pif)' \
'-[i]regex' geht nicht mit jedem find (aber immerhin auch mit älteren GNU finds bzw. AFAIK den verbreitetsten).
oder auch mit Emacs regexp:
find ... -iregex '.*\.\(exe\|com\|scr\|dll\|bat\|cmd\|pif\)' \
Das ist nicht emacs-Regex sondern "(POSIX) basic RE", das andere sind "(POSIX) Extended RE" (bzw. egrep REs, IIRC gibt's da geringe Abweichungen) ;)
-exec ls -b1 {} \+
Auch das '-exec .. {} +' geht nicht mit älteren GNU finds (wie meinem). Das ist ein erst vor relativ kurzem von den BSD-finds in GNU find übernommenes Feature; im 97er POSIX ist es noch nicht drin, im aktuellen IIRC schon. Wenn es vorhanden ist, ist "-exec ... +" die empfehlenswerte Variante (bzw. besser noch, "-execdir .. +"). Bei älteren GNU finds / GNU xargs ist -iregex '.*\.\(exe\|com\|scr\|dll\|bat\|cmd\|pif\)' \ -print0 | xargs -0 ... das Mittel der Wahl. Nicht standardisiert, aber halbwegs portabel und ebenfalls ausreichend sicher ist: find .... -iname '*.exe' -o -iname ... -exec {} \; aber das war ja der Ausgangspunkt ;) Ansonsten läuft find ... -iregex '...' -exec ... {} + noch auf den meisten Plattformen. Das ganze ist ein ziemlich leidiges Thema (und taucht wohl häufiger in de.comp.os.unix.shell auf -- und auch hier). HTH, -dnh -- Tower to pilot: "Air traffic 3 o'clock!" Pilot to tower:" Give us another hint, we have digital watches..." -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, On Wednesday 28 February 2007 16:38:43 David Haller wrote:
$ find --version GNU find version 4.2.28 *vergeb* :)
Da war ich unpraezise. Find versteht unter "emacs" etwas aehnliches wie "posix-basic". $ ls -1 f.dat f.txt $ echo;for t in emacs posix-basic posix-egrep posix-extended; do echo "type=$t" echo "A:"; find . -regextype $t -iregex '.*\.(txt|dat)' echo "B:"; find . -regextype $t -iregex '.*\.\(txt\|dat\)' done type=emacs A: B: ./f.dat ./f.txt type=posix-basic A: B: ./f.dat ./f.txt type=posix-egrep A: ./f.dat ./f.txt B: type=posix-extended A: ./f.dat ./f.txt B: $ find . -iregex '.*\.(txt|dat)' $ find . -regextype posix-egrep -iregex '.*\.(txt|dat)' ./f.dat ./f.txt $ find . -regextype posix-egrep -iregex '.*\.\(txt\|dat\)' $ find . -regextype emacs -iregex '.*\.\(txt\|dat\)' ./f.dat ./f.txt $ find . -iregex '.*\.\(txt\|dat\)' ./f.dat ./f.tx
Auch das '-exec .. {} +' geht nicht mit älteren GNU finds ...
Mir ist es auch erst kuerzlich positiv aufgefallen, verwende es aber nur in Scripts von denen ich wiess, dass sie lokal bleiben, oder eben mal schnell auf dem CLI. Ein leidiges Thema sind kranke Dateinamen wie sie jetzt immer haeufiger "auftauchen". Die korrekte Behandlung von Spaces in Filenamen ist ja nur ein Punkt. Hier hat MS' PowerShell sicher ein paar Vorteile, indem sie Objekte durchreicht. Ein weiteres sind Escapes. Das hat mich schon so manchmal zu Python getrieben, speziell wenn in Parametern Hochkommas uebergeben werden muessen. Have fun Roman -- Roman Fietze Telemotive AG Büro Mühlhausen
Hallo, On Tuesday 27 February 2007 17:28:02 Jens Strohschnitter wrote:
find $yourpath -mtime +30 -type f \ -name \*.exe -o -name \*.bat -o -name \*.pif \ -exec rm {} \+ Zum Antesten erst mal vielleicht mit "-ok" anstatt "-exec". Roman -- Roman Fietze Telemotive AG Büro Mühlhausen
participants (5)
-
David Haller
-
Dr. Jürgen Vollmer
-
Jens Strohschnitter
-
Joerg Thuemmler
-
Roman Fietze