PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Alles Löschen mit Ausnahme!?



gordon2
29-06-2008, 11:23
Hallo,

ich würde gerne "fast" alles in einem Ordner löschen.
Das geht ja z.B. mit "rm -rf *". Nun soll aber eventuell ein File erhalten bleiben.
Kann man das irgendwie mit angeben, also lösche alles, ausser ....

Grüße,
Gordon

mehlvogel
29-06-2008, 11:44
Ich hab das mal in dieses Forum verschoben, weil ich denke das es hier besser aufgehoben ist.

ContainerDriver
29-06-2008, 12:59
Hallo Gordon,

ich würde das mit Hilfe eines Umwegs über find machen:


find \! -type d \! -iname '<Dateiname>' -exec rm {} \;


Das löscht dir alle Dateien, außer die, die <Dateiname> heißen; da könnte z.B. auch


find \! -type d \! -iname 'wichtig*' -exec rm {} \;

stehen, d.h. alle Dateien die mit "wichtig" anfangen werden nicht gelöscht. Wenn du mehrere Suchmuster hast, dann kannst du die mit -a bzw. -o (De Morgansches Gesetz (http://de.wikipedia.org/wiki/De_Morgansche_Gesetze) beachten!) zusammenschließen:


find \! -type d \! ( -iname 'wichtig*' -o -iname 'auch_wichtig*' ) -exec rm {} \;

Übrigens: der find-Aufruf oben arbeitet auch rekursiv, außerdem werden keine Verzeichnisse gelöscht.

Gruß, Florian

jan61
29-06-2008, 18:47
Moin,


...

find \! -type d \! ( -iname 'wichtig*' -o -iname 'auch_wichtig*' ) -exec rm {} \;


Kleine Korrektur: Die \ stehen an den falschen Stellen ;-) Die "!" brauchen nicht entwertet zu werden, dafür zwingend aber die "()" - sonst wird's eine Subshell, und die ist an der Stelle unpassend:

find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -exec rm {} \;
Und wenn es schön optimal sein soll, dann statt der vielen rm-Forks lieber xargs:

find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -print | xargs rm
Jan

peschmae
29-06-2008, 19:37
Ich bin pragmatisch:



F=wichtigfile
mv $f ..
rm -Rf *
mv ../$f .


:D

MfG Peschmä

P.S. natürlich macht man das nicht wenn $f gross und .. auf einer andere Partition ist..., oder wenn man die Rechte nicht hat, oder wegen sonstwas

ContainerDriver
30-06-2008, 07:27
Moin,

Kleine Korrektur: Die \ stehen an den falschen Stellen ;-) Die "!" brauchen nicht entwertet zu werden, dafür zwingend aber die "()" - sonst wird's eine Subshell, und die ist an der Stelle unpassend:

find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -exec rm {} \;



Oh, hab ich übersehen. Ich wusste auch nicht, dass man Ausrufezeichen nicht escapen muss, weil z.B. bei


echo "Hallo!"

die Meldung 'bash: !": event not found' kommt, das scheint aber einen anderen Hintergrund zu haben.



Und wenn es schön optimal sein soll, dann statt der vielen rm-Forks lieber xargs:

find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -print | xargs rm
Jan

Wenn es noch optimaler werden soll, dann könnte man bei find auch -print0 und bei xargs -0 verwenden ;)

Gruß, Florian

jan61
01-07-2008, 19:14
Moin,


Ich bin pragmatisch:



F=wichtigfile
mv $f ..
rm -Rf *
mv ../$f .
:D

MfG Peschmä

P.S. natürlich macht man das nicht wenn $f gross und .. auf einer andere Partition ist..., oder wenn man die Rechte nicht hat, oder wegen sonstwas

und vor allem definiert man nicht GROSS F, um dann klein $f wegzumoven - dann isse nämlich futsch, die "wichtigfile" ;-)

Andere Partition sollte eigentlich für mv kein Problem mehr sein, die Einschränkung gabs IIRC früher in alten Unixen mal. So weit ich weiß, macht dann mv erst einen cp und dann einen rm.

Jan

EDIT: Ich hab gerade gesehen, dass bei Deiner Partitions-Geschichte ein "UND" stand - dann gebe ich Dir natürlich recht, würde ziemlich bremsen. Da der mv aus diversen Gründen schiefgehen kann, würde ich ihn immer so aufrufen: "mv $F .. || exit 1" - damit stelle ich sicher, dass der folgende rm nicht aufgerufen wird, wenn "wichtigfile" nicht in Sicherheit gebracht worden ist.

jan61
01-07-2008, 20:34
Moin,


...dass man Ausrufezeichen nicht escapen muss, weil z.B. bei


echo "Hallo!"
die Meldung 'bash: !": event not found' kommt, das scheint aber einen anderen Hintergrund zu haben.

Das dürfte daran liegen, WIE die Shell interpretiert. In dem Fall ist die Krux, dass
echo hallo! 'hallo!' funktioniert - erst mit den "" machst Du die Shell drauf aufmerksam ;-)


Wenn es noch optimaler werden soll, dann könnte man bei find auch -print0 und bei xargs -0 verwenden ;)

Stimmt, damit ist man auch die Sorge um Leerzeichen und anderes Geraffel in Dateinamen los.

Jan

peschmae
01-07-2008, 21:37
und vor allem definiert man nicht GROSS F, um dann klein $f wegzumoven - dann isse nämlich futsch, die "wichtigfile" ;-)


Hats alles schon gegeben :D

Aber wenn ich richtige Scripts und nicht Forenbeiträge schreibe mache ich natürlich keine Fehler. ;)

MfG Peschmä

jan61
01-07-2008, 22:45
Moin,


Aber wenn ich richtige Scripts und nicht Forenbeiträge schreibe mache ich natürlich keine Fehler. ;)

jepp, ich auch niemals nicht. Ich baue nur ab und zu "überraschende, undokumentierte Features" ein - natürlich immer mit Absicht :rolleyes:

Jan

peschmae
02-07-2008, 16:02
Schon klar - ich auch, sonst könnte ja jeder kommen und einfach meine Scripts benutzen ;)

gordon2
12-07-2008, 13:47
Hallo an alle,

vielen Dank für die zahlreichen Mails.
Ich hatte leider vergessen, dass ich die Frage gestellt hatte...hab ich heute durch Zufall wieder entdeckt..;-)

Grüße,
Gordon

ThorstenS
15-07-2008, 05:52
find kennt mittlerweile -delete :)