2012-05-10 7 views

Antwort

5

Der Befehl ls -l gab eine Liste aller Unterverzeichnisse in Ihrem aktuellen Present-Working-Directory (PWD).

Der Befehl rm kann mehrere Dateien/Verzeichnisse löschen, wenn Sie sie als Liste übergeben.

zB: rm test1.txt test2.txt myApp werden alle drei der Dateien mit Namen löschen:

test1.txt 
test2.txt 
myApp 

Auch die Fahnen für die rm Befehl, den Sie verwendet werden, sind häufig in vielen eine Torheit.
rm -f - Kraft Löschen von Dateien, ohne zu fragen oder
rm -r bestätigt - Recurse in allen Unterverzeichnissen und löschen alle Inhalte und Unterverzeichnisse

Also, sagen wir, Sie in/home/user sind, und die Verzeichnisstruktur wie folgt aussieht so:

/home/user 
|->dir1 
|->dir2 
`->file1.txt 

der ls -l Befehl wird die Liste zur Verfügung stellen "dir1 dir2 file1.txt", und das Ergebnis des Befehls enthält ls -l | xargs rm -rf wird wie folgt aussehen:
rm -rf dir1 dir2 file1.txt

Wenn wir Ihre ursprüngliche Frage mit dem obigen Beispiel zu erweitern, der letzte Befehl, der an das System übergeben wird wird: rm -rf di1 dir2 file1.txt bark.*

Also, alles im aktuellen Verzeichnis ausgelöscht wird, so dass die bark.* ist redundant (Sie haben der Maschine effektiv gesagt, dass sie sowieso alles im aktuellen Verzeichnis zerstören soll).

Ich denke, was Sie zu tun gemeint war, alle Dateien im aktuellen Verzeichnis löschen und alle Unterverzeichnisse (recurse), die mit bark. beginnen, das zu tun, müssen Sie nur noch tun:
find -iname bark.* | xargs rm

Der Befehl über Mittel "finde alle Dateien in diesem Verzeichnis und in den Unterverzeichnissen, ignoriere UPPERCASE/Kleinbuchstaben/mIxEdCaSe, die mit den Zeichen" bark. "beginnen, und lösche sie". Dies könnte immer noch ein schlechter Befehl sein, wenn Sie einen Tippfehler haben. Sie sollten also immer testen, bevor Sie eine Batch-Löschung durchführen.

In Zukunft sollten Sie zuerst eine Liste aller Dateien erstellen, die Sie zuerst löschen möchten, um zu bestätigen, dass es sich um diejenigen handelt, die gelöscht werden sollen.
find -iname bark.* | xargs echo

Dann, wenn Sie sicher sind, löschen Sie diese über
find -iname bark.* | xargs rm

Hoffnung, das hilft. https://github.com/MrMEEE/bumblebee-Old-and-abbandoned/commit/a047be85247755cdbe0acce6f1dafc8beb84f2ac

Ein automatisiertes Skript läuft so etwas wie rm -rf /usr/local/........., aber aufgrund versehentlich ein Leerzeichen einfügen, den Befehl:

Als humoristischer Note, einer der bekanntesten Fälle von „rm -rf“ finden Sie hier wurde rm -rf /usr /local/......, so bedeutet dies effektiv "löschen Sie alle Root-Ordner, die mit usr oder lokalen beginnen", effektiv das System von jedem, der es nutzt zu zerstören.Ich fühle mich schlecht für diesen Entwickler.

Sie können diese Art von Fehler vermeiden, indem Sie die Saiten zu zitieren, das heißt: rm -rf "/usr/ local/...." würde eine Fehlermeldung zur Verfügung gestellt haben und diesen Fehler vermieden, da die Anführungszeichen bedeuten, dass alles, was zwischen ihnen den vollständigen Pfad, nicht eine Liste von getrennten Wegen/files (dh: Sie sagen rm, dass die Datei/der Ordner ein Leerzeichen in seinem Namen hat).

10

Das Argument -r bedeutet "rekursiv löschen" (dh in Unterverzeichnisse absteigend). Der Befehl -f bedeutet "force" (mit anderen Worten, fragen Sie nicht nach Bestätigung). -rf bedeutet "rekursiv in Unterverzeichnisse absteigend, ohne nach Bestätigung zu fragen"

ls -l listet alle Dateien im Verzeichnis auf. xargs nimmt die Eingabe von ls -l und hängt ihn an den Befehl übergeben Sie xargs

Der letzte Befehl, der wie folgt ausgeführt wurde angesehen:

rm -rf bark.* <output of ls -l> 

Diese im Wesentlichen entfernt bark.*und alle Dateien im aktuellen Verzeichnis . Moral der Geschichte: sei sehr vorsichtig mit rm -rf. (Sie können rm -ri verwenden, um vor dem Löschen von Dateien stattdessen zu fragen)

6

rm(1) löschte jede Datei und jedes Verzeichnis im aktuellen Arbeitsverzeichnis, weil Sie es gefragt haben.

Um grob zu sehen, was passiert ist, führen Sie dies:

cd /etc ; ls -l | xargs echo 

Achten Sie besonders auf den Ausgang.

Ich empfehle dringend echo anstelle von rm -rf beim Erstellen von Befehlszeilen. Nur wenn die Ausgabe in Ordnung ist, sollten Sie den Befehl mit rm -rf erneut ausführen. Wenn Sie Zweifel haben, verwenden Sie einfach rm -r, damit Sie nicht versehentlich zu viel wegblasen. rm -ir Wenn Sie sind sehr skeptisch von Ihrer Befehlszeile. (Ich habe seit 1994 Linux benutze und ich noch diesen echo Trick verwenden, wenn etwas komplizierte Befehlszeilen Konstruktion selektiv einen Stapel von Dateien zu löschen.)

Im übrigen würde ich ls(1) Ausgang in irgendeiner Art und Weise vermeiden Parsen - Dateinamen kann enthalten beliebig Zeichen außer ASCII NUL und / Zeichen - einschließlich Zeilenumbrüche, Registerkarten und Ausgabe, die aussieht wie ls -l Ausgabe. Versuchen, parsen dies mit Tools wie xargs(1) kann gefährlich sein.

Verwenden Sie stattdessen find(1) für diese Art von Dingen. So löschen Sie alle Dateien in allen genannten Verzeichnisse bark.*, würde ich einen Befehl wie folgt ausführen:

find . -type d -name 'bark.*' -print0 | xargs -0 rm -r 

Noch einmal, ich echo anstelle von rm -r für die erste Ausführung verwenden würde - und wenn es gut aussah, dann Ich würde wieder mit rm -r laufen.

+0

Hin und wieder finde ich mich auf Systemen ohne 'finde -print0' und die gepaarten' xargs -0'. Sehr sehr nervig. Ich denke, dass Solaris ein solcher verkrüppelter Kretin sein kann. – tchrist