Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Alles Löschen mit Ausnahme!?

  1. #1
    Registrierter Benutzer
    Registriert seit
    07.09.2007
    Beiträge
    18

    Alles Löschen mit Ausnahme!?

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Ich hab das mal in dieses Forum verschoben, weil ich denke das es hier besser aufgehoben ist.
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  3. #3
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hallo Gordon,

    ich würde das mit Hilfe eines Umwegs über find machen:
    Code:
    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
    Code:
    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 beachten!) zusammenschließen:
    Code:
    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
    Ein gebrechlich Wesen ist der X-Server.

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von ContainerDriver Beitrag anzeigen
    ...
    Code:
    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:
    Code:
     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:
    Code:
     find ! -type d ! \( -iname 'wichtig*' -o -iname 'auch_wichtig*' \) -print | xargs rm
    Jan

  5. #5
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich bin pragmatisch:

    Code:
    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
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  6. #6
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Zitat Zitat von jan61 Beitrag anzeigen
    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:
    Code:
     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
    Code:
    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:
    Code:
     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
    Ein gebrechlich Wesen ist der X-Server.

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von peschmae Beitrag anzeigen
    Ich bin pragmatisch:

    Code:
    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
    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.
    Geändert von jan61 (01-07-2008 um 20:23 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von ContainerDriver Beitrag anzeigen
    ...dass man Ausrufezeichen nicht escapen muss, weil z.B. bei
    Code:
    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
    Code:
    echo hallo! 'hallo!'
    funktioniert - erst mit den "" machst Du die Shell drauf aufmerksam ;-)

    Zitat Zitat von ContainerDriver Beitrag anzeigen
    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

  9. #9
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von jan61 Beitrag anzeigen
    und vor allem definiert man nicht GROSS F, um dann klein $f wegzumoven - dann isse nämlich futsch, die "wichtigfile" ;-)
    Hats alles schon gegeben

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

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  10. #10
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von peschmae Beitrag anzeigen
    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

    Jan

  11. #11
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Schon klar - ich auch, sonst könnte ja jeder kommen und einfach meine Scripts benutzen
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  12. #12
    Registrierter Benutzer
    Registriert seit
    07.09.2007
    Beiträge
    18

    Alles Löschen mit Ausnahme!

    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

  13. #13
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    find kennt mittlerweile -delete

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •