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
Druckbare Version
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
Ich hab das mal in dieses Forum verschoben, weil ich denke das es hier besser aufgehoben ist.
Hallo Gordon,
ich würde das mit Hilfe eines Umwegs über find machen:
Das löscht dir alle Dateien, außer die, die <Dateiname> heißen; da könnte z.B. auchCode:find \! -type d \! -iname '<Dateiname>' -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 beachten!) zusammenschließen:Code:find \! -type d \! -iname 'wichtig*' -exec rm {} \;
Übrigens: der find-Aufruf oben arbeitet auch rekursiv, außerdem werden keine Verzeichnisse gelöscht.Code:find \! -type d \! ( -iname 'wichtig*' -o -iname 'auch_wichtig*' ) -exec rm {} \;
Gruß, Florian
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:Und wenn es schön optimal sein soll, dann statt der vielen rm-Forks lieber xargs:Code:find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -exec rm {} \;
JanCode:find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -print | xargs rm
Ich bin pragmatisch:
:DCode:F=wichtigfile
mv $f ..
rm -Rf *
mv ../$f .
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
Oh, hab ich übersehen. Ich wusste auch nicht, dass man Ausrufezeichen nicht escapen muss, weil z.B. bei
die Meldung 'bash: !": event not found' kommt, das scheint aber einen anderen Hintergrund zu haben.Code:echo "Hallo!"
Wenn es noch optimaler werden soll, dann könnte man bei find auch -print0 und bei xargs -0 verwenden ;)Zitat:
Und wenn es schön optimal sein soll, dann statt der vielen rm-Forks lieber xargs:JanCode:find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -print | xargs rm
Gruß, Florian
Moin,
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.
Moin,
Das dürfte daran liegen, WIE die Shell interpretiert. In dem Fall ist die Krux, dassfunktioniert - erst mit den "" machst Du die Shell drauf aufmerksam ;-)Code:echo hallo! 'hallo!'
Stimmt, damit ist man auch die Sorge um Leerzeichen und anderes Geraffel in Dateinamen los.
Jan
Schon klar - ich auch, sonst könnte ja jeder kommen und einfach meine Scripts benutzen ;)
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
find kennt mittlerweile -delete :)