• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Shell finden und löschen!

cyrix20

Member
Also ich würde gerne alle sicherungsdateien des types ~ löschen! Hab mir gedacht am einfachsten über ein kleines shell skript!

Code:
#!/bin/sh
find / -iname *~ >> 1.txt
rm `cat 1.txt`

Das Skript hat nur einen Fehler ~/home/Auto Versicherung/1~ wird z.B. nicht gelöscht, da da ein Lehrzeichen bei "Auto Versicherung" ist!

Jemand ein Vorschlag?
 

Gimpel

Guru
Code:
find -type f -iname *~ -exec rm -f '{}' \;
;)

Mit cat geht das deshalb nicht, weil das quasi eine Liste ausspuckt:
Code:
$ echo `cat 1.txt`
./aaa bbb/test 123.txt~ ./aaa bbb/test 456.txt~ ./aaa bbb/test 789.txt~
Damit führst du also ein
Code:
rm ./aaa bbb/test 123.txt~ ./aaa bbb/test 456.txt~ ./aaa bbb/test
aus, was natürlich Schmarrn ist.
 

longman

Advanced Hacker
Ich muss gestehen, dass ich es bis eben so machen wollte wie Du und nur deshalb die
action -delete gefunden habe, weil ich für den thread find --help aufgerufen hatte, um
nochmal die genaue Syntax zu schauen.
:wink:
 

regexer

Advanced Hacker
longman schrieb:
action -delete gefunden habe, weil ich für den thread find --help aufgerufen hatte
Das scheint auch eine GNU-Spezialität zu sein. Auf unseren Solaris-Systemen hier gibt's keinen -delete. Aber natürlich funktioniert dann der Vorschlag mit -exec ...
 
OP
C

cyrix20

Member
Ok Danke. Jetzt hätte ich noch 4 Befehle für die ich kein Ansatz habe!

1. Lehre Ordner finden
2. Ordner finden die mit Inhalt unter 5MB groß sind
3. dateien finden die kleiner als 1 MB sind?
4. Alle dateien finden AUSSER Ordner und AUSSER *.mp3
Weiß da jemand zufällig was?
 

Gimpel

Guru
cyrix20 schrieb:
Ok die 1 haben wir schonmal!

Wie siehts aus mit der 2-4.
4:
Code:
find . -type f \( ! -iname "*.mp3" \)
Für 2 fällt mir grad nur hoch kompliziertes zeug mit find, du, awk usw ein. Da kennt hier jemand bestimmt was einfacheres.
 
4. Alle dateien finden AUSSER Ordner und AUSSER *.mp3

Vier muss oben nicht richtig beantwortet sein.
Named pipes, char/block devices sollen die auch gefunden werden ?

Wenn man 4. als Frage zerlegt: Datei: was zählt als Datei. Auch ein Ordner ?
Wenn ein Ordner nicht als Datei zählt, warum wird es dann explizit erwähnt und
was zählt dann als Datei ( ! -type d ) ?

4 könnte als Lösung haben:
find . ! -type d | grep -v ".mp3$"

Je nach dem wie man datei definiert..

2.: ( Achtung wie werden in der Frage 5MB definiert... ist 5000000 richtig ?)
find . -type d | xargs du -b -s 2>/dev/null | awk ' { if ( $1 < 5000000 ) print }'

3. sollte mit size gehen... Aber: Diskussion was ist eine Datei unter 4 beachten...

Haveaniceday

Edit: PS: Da man bei 2. bestimmt die Größe nicht haben möchte müsste man print $2 statt print schreiben...
 

regexer

Advanced Hacker
haveaniceday schrieb:
Edit: PS: Da man bei 2. bestimmt die Größe nicht haben möchte müsste man print $2 statt print schreiben...
Könnte schon wieder gefährlich sein, da Dateinamen auch spaces haben können. Ungetesteter Vorschlag:

Code:
... | awk '{if ($1 < 5000000){$1="";print} }'

Im Moment fällt mir auch nichts besseres außer perl ein.
 

Gimpel

Guru
Wie gehst du bei 2. mit Leerzeichen in Dateinamen um?
Code:
$ find -type d -exec du -sk '{}' \;|awk '$1<1024 { print }'|cut -f 2
.
./ccc
./aaa
./aaa bbb
./bbb
..gibt schonmal ne Liste aus (kleiner 1MB). Dann wäre wieder der Mist mit Leerzeichen im Verzeichnisnamen, angenommen man piped es an xargs.
EDIT:
Code:
find -type d -exec du -sk '{}' \;|awk '$1<1024 { print }'|cut -f 2|xargs -0 -d"\n" rm -r
tut das dann.

Btw:
Code:
$ find . -type d | xargs du -b -s 2>/dev/null | awk ' { if ( $1 < 5000000 ) print }'
20576	.
4096	./ccc
4096	./aaa
4096	./aaa
4096	bbb
4096	./bbb
Funktioniert nicht.
 
notoxp schrieb:
longman schrieb:
action -delete gefunden habe, weil ich für den thread find --help aufgerufen hatte
Das scheint auch eine GNU-Spezialität zu sein. Auf unseren Solaris-Systemen hier gibt's keinen -delete. Aber natürlich funktioniert dann der Vorschlag mit -exec ...
Und der mit xargs ist auch noch schneller. Natürlich nicht so schnell wie -delete.
 

longman

Advanced Hacker
Frage an die wirklichen find Freaks:

Code:
$ find . -type d | xargs du -b -s 2>/dev/null | awk ' { if ( $1 < 5000000 ) print }'
Respekt :)

könnte man hier nicht auch den find Befehl selber nutzen, da es ja den Testparameter -size gibt ?

Bin gerade noch auf der Arbeit, sodass ich das nicht testen kann.
Aber ich denke da müßte doch auch noch einiges gehen...
Oder kann man nur die konkrete "size" ermitteln aber nicht vergleichen auf <,> .... ?
 
Oben