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:
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 ?
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
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 ?
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
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
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 ?
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
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:
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 ?
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:
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)
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:
Am Die, 27 Feb 2007, Dr. Jürgen Vollmer schrieb:
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)
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. wieso? Ich hatte den Eindruck, daß wenn -print vorne steht, daß nachfolgen -name keine Rolle mehr spielen.
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:
Am Dienstag, 27. Februar 2007 schrieb David Haller:
Am Die, 27 Feb 2007, Dr. Jürgen Vollmer schrieb:
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)
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. wieso? Ich hatte den Eindruck, daß wenn -print vorne steht, daß nachfolgen -name keine Rolle mehr spielen.
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.
IMO steht das auch irgendwie in der manpage, aber wohl mehr oder weniger nur implizit...
hab' auf den ersten Blick nichts gefunden.
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:
Hallo,
Am Mit, 28 Feb 2007, Dr. Jürgen Vollmer schrieb:
Am Dienstag, 27. Februar 2007 schrieb David Haller:
Am Die, 27 Feb 2007, Dr. Jürgen Vollmer schrieb:
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)
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.
wieso? Ich hatte den Eindruck, daß wenn -print vorne steht, daß nachfolgen -name keine Rolle mehr spielen.
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.
IMO steht das auch irgendwie in der manpage, aber wohl mehr oder weniger nur implizit...
hab' auf den ersten Blick nichts gefunden.
Zumindest teilweise implizit in der Beschreibung von EXPRESSION.
Ja, ist wüst.
-dnh
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:
David Haller wrote:
Hallo,
Am Mit, 28 Feb 2007, Dr. Jürgen Vollmer schrieb:
Am Dienstag, 27. Februar 2007 schrieb David Haller:
Am Die, 27 Feb 2007, Dr. Jürgen Vollmer schrieb:
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)
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.
wieso? Ich hatte den Eindruck, daß wenn -print vorne steht, daß nachfolgen -name keine Rolle mehr spielen.
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.
IMO steht das auch irgendwie in der manpage, aber wohl mehr oder weniger nur implizit...
hab' auf den ersten Blick nichts gefunden.
Zumindest teilweise implizit in der Beschreibung von EXPRESSION.
Ja, ist wüst.
-dnh
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...
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:
Am Mittwoch, 28. Februar 2007 schrieb Joerg Thuemmler:
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...
Genau. [..]
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
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
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.
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
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 ?
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
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 ?
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:
Am Dienstag, 27. Februar 2007 schrieb Jens Strohschnitter:
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 ?
find .... -print0 -name "*.exe" -o -name "*.bat" ... | xargs -0 rm -f
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 --
Du kannst niemals einer großen Panne entgehen, in dem Du eine kleine produzierst. Aber umgekehrt. Das nennt sich dann "Windows-Bugfix". [Sascha Wirth und Sebastian Weiser in dtk] -- 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
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 ?
find .... -print0 -name "*.exe" -o -name "*.bat" ... | xargs -0 rm -f
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.
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:
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
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:
On Tuesday 27 February 2007 21:03:14 David Haller wrote:
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
Und was haelst du von:
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:
Teilweise viel, -[i]regex war mit komplett entfallen. Aber immerhin gibt's -[i]regex nicht überall (s.u.) *rausred* ;)
$ find --version GNU find version 4.1
$ find --version GNU find version 4.2.28 *vergeb* :)
Das ist nicht emacs-Regex sondern "(POSIX) basic RE", das andere sind "(POSIX) Extended RE" (bzw. egrep REs, IIRC gibt's da geringe Abweichungen) ;)
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:
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 {} \;
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