`find -delete` Alles gelöscht


8

Ich bin nicht allzu vertraut findund habe es versehentlich geschafft, eine Menge Dateien zu löschen. Ich habe mich gefragt, ob jemand mit mehr Erfahrung erklären kann, wo ich falsch gelaufen bin.


Ich wollte alle die aufzuräumen .DS_Storeund ._.DS_StoreDateien , dass mein MacBook Finder wurde barfing alle über meine Raspbian Samba - Freigabe.

  • Ich habe eine Festplatte an meinen Himbeer-Pi angeschlossen, mit einigen Symlinks in meinem Home-Ordner zum Montagepunkt, daher die -L.
  • Einige der Ordner gehören Systembenutzern (z. B. Apache), daher die sudo.

Ich habe Folgendes ausgeführt, um sicherzustellen, dass finddie richtigen Dateien ausgewählt wurden:

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -name \*DS_Store\*
./.DS_Store
./Downloads/USBHDD1/._.DS_Store
./Downloads/USBHDD1/.DS_Store
./Downloads/USBHDD1/backups/ALAC/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/USBHDD1/backups/ALAC/.DS_Store
./Downloads/USBHDD1/backups/._.DS_Store
./Downloads/USBHDD1/backups/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/._.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/FLAC/.DS_Store
./Downloads/USBHDD1/backups/Storage/._.DS_Store
./Downloads/USBHDD1/backups/Storage/.DS_Store
./Downloads/OriginalMusic/._.DS_Store
./Downloads/OriginalMusic/.DS_Store
./Downloads/OriginalMusic/FLAC/.DS_Store
./Downloads/ALAC/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/ALAC/.DS_Store

Alles sieht gut aus!

Ich habe dann das -deleteFlag hinzugefügt find, um die gefundenen Dateien zu entfernen:

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -delete -name \*DS_Store\*
find: cannot delete `./Documents': Not a directory
find: cannot delete `./Pictures': Not a directory
find: cannot delete `./Music': Not a directory

Als ich merkte, dass aus irgendeinem Grund versucht wurde, meine Symlinks zu löschen, gab ich Ctrl+Cungefähr die Hälfte der Daten ein und speicherte sie.

Dokumente, Bilder und Musik sind Toast. Es hat wahrscheinlich an meinem riesigen Downloads-Ordner funktioniert, in den ich fast alles gelegt habe.


Warum wurden findalle diese Dateien gelöscht? Habe ich -deletean der falschen Stelle platziert?

Antworten:


14

Ihre Antwort ist in der findManpage.

Die Löschoption wird vor Ihrem Namensfilter verarbeitet.

       -delete
          Delete files; true if removal succeeded.  If the removal failed,
          an  error message is issued.  If -delete fails, find's exit sta‐
          tus will be nonzero (when it eventually exits).  Use of  -delete
          automatically turns on the -depth option.

          Warnings:  Don't  forget that the find command line is evaluated
          as an expression, so putting -delete first will make find try to
          delete everything below the starting points you specified.  When
          testing a find command line that you later intend  to  use  with
          -delete,  you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete  implies  -depth,  you  cannot
          usefully use -prune and -delete together.

Sie hätten die Löschoption als letzte Ihres Befehls verschieben können

Alternativ hätten Sie auch so etwas verwenden können

find /path -name "*pattern*" | xargs rm -f

oder

find /path -name "*pattern*" -exec rm -f {} \;

1
+1 außer xargs, execlösen Sie das Problem überhaupt nicht (dieselbe Gefahr, wenn Sie -print0 oder -exec am Anfang anstelle des Endes hinzufügen).
Frostschutz

1
Ah, ich habe die manSeite falsch gelesen . Ich dachte, es heißt, dass -deletees nach dem Pfad ("Startpunkt") sein muss, nicht nach dem Muster.
Hydraxan14

4
@ Hydraxan14 der Punkt ist, dass die Dinge von links nach rechts verarbeitet werden, so dass Ihr Befehl warfind things which are less than 256 directory levels down and delete them and whose name contains DS_Store
icarus

@icarus Wenn ich den Befehl so umschreibe, kann ich ihn viel besser verstehen. Vielen Dank! Ich bin an andere * nix-Befehle gewöhnt, denen es egal ist, wohin die Flags gehen.
Hydraxan14

1
@ Hydraxan14 Viele Befehle kümmern sich um die Reihenfolge der Befehlszeilenflags. Vergleiche zum Beispiel ls -1 -lmit ls -l -1.
Kusalananda

1

Das Grundprinzip der Befehlszeile von findlautet „Wenn Bedingung und Bedingung und… dann Aktion“. Beachten Sie, dass die Aktion als letzte ausgeführt wird - sie unterscheidet sich erheblich vom Format des Aufrufs eines Befehls, der "Aktionsobjektobjekt ..." lautet.

Bedeutet zum Beispiel find . -name \*DS_Store\* -delete"Wenn der Name übereinstimmt, *DS_Store*dann löschen". Wenn Sie die Bedingung und die Aktion umkehren, hat die -deleteAktion keine Bedingung, sodass sie bedingungslos angewendet wird.

Der Grund, warum find . -delete -name \*DS_Store\*es sich nicht um einen Syntaxfehler handelt, besteht darin, dass Aktionen auch Bedingungen sind. Die -deleteAktion ist eine echte Bedingung, wenn sie erfolgreich ist, und falsch, wenn sie fehlschlägt (z. B. aufgrund fehlender Berechtigungen). Druckt beispielsweise find . -name somethingorother -delete -printdie Namen der Dateien, die erfolgreich gelöscht wurden.

Der Grund, warum find -name \*DS_Store\*es sich nicht um einen Syntaxfehler handelt, liegt darin, dass eine implizite -printAktion vorliegt, wenn keine Aktion vorhanden ist . Es wurde auf diese Weise entworfen, da das Drucken eine sehr häufige Wahl ist.

(Beachten Sie, dass meine Antwort zwar keine direkte Lüge enthält, aber einige Dinge vereinfacht. Es gibt Merkmale find, die in den Erklärungen in meiner Antwort nicht behandelt werden, insbesondere die !und -ologischen Operatoren.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.