Ich habe eine lange Textdatei mit einer Liste von Dateimasken, die ich löschen möchte
Beispiel:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
Ich muss sie löschen. Versucht rm `cat 1.txt` und es heißt, die Liste ist zu lang.
Ich habe diesen Befehl gefunden, aber wenn ich Ordner aus der Liste überprüfe, haben einige von ihnen noch Dateien.
xargs rm <1.txt
Manueller rm-Aufruf entfernt Dateien aus solchen Ordnern, sodass keine Probleme mit Berechtigungen auftreten.
Antworten:
Dies ist nicht sehr effizient, funktioniert aber, wenn Sie Glob-Muster benötigen (wie in / var / www / *).
Wenn Sie keine Muster haben und sicher sind, dass Ihre Pfade in der Datei keine Leerzeichen oder andere seltsame Dinge enthalten, können Sie Xargs wie folgt verwenden:
quelle
Angenommen, die Liste der Dateien befindet sich in der Datei
1.txt
, dann gehen Sie wie folgt vor :Die
-r
Option bewirkt eine Rekursion in alle in genannten Verzeichnisse1.txt
.Wenn Dateien schreibgeschützt sind, verwenden Sie die
-f
Option, um das Löschen zu erzwingen:Seien Sie vorsichtig mit dem Eingang zu jedem Werkzeug , die programmatische Deletion tut. Stellen Sie sicher, dass die in der Eingabedatei genannten Dateien wirklich gelöscht werden sollen. Seien Sie besonders vorsichtig bei scheinbar einfachen Tippfehlern. Wenn Sie beispielsweise ein Leerzeichen zwischen einer Datei und ihrem Suffix eingeben, werden zwei separate Dateinamen angezeigt:
ist eigentlich zwei separate Dateien:
file
und.txt
.Das mag nicht so gefährlich erscheinen, aber wenn der Tippfehler so etwas ist:
Dann , anstatt alle Dateien löschen , die mit beginnen
myoldfiles
, werden Sie am Ende zu löschenmyoldfiles
und alle nicht-Punkt-Dateien und Verzeichnisse im aktuellen Verzeichnis. Wahrscheinlich nicht das, was du wolltest.quelle
Benutze das:
Wenn Sie eine Glob-Erweiterung benötigen, können Sie das Zitieren weglassen
$file
:Aber seien Sie gewarnt, dass Dateinamen "problematischen" Inhalt enthalten können und ich die nicht zitierte Version verwenden würde. Stellen Sie sich dieses Muster in der Datei vor
Dies würde ziemlich viel aus dem aktuellen Verzeichnis löschen! Ich möchte Sie ermutigen, die Löschliste so vorzubereiten, dass keine Glob-Muster mehr erforderlich sind, und dann wie in meinem ersten Beispiel Zitate zu verwenden .
quelle
/My Dir With Spaces/
/Spaces and globs/*.txt
,--file-with-leading-dashes
und als Bonus ist es POSIX und Werke auf GNU / Linux, MacOS und BSD.Sie können '\ n' verwenden, um das neue Zeilenzeichen als Trennzeichen zu definieren.
Seien Sie vorsichtig mit dem -rf, da es löschen kann, was Sie nicht möchten, wenn der 1.txt Pfade mit Leerzeichen enthält. Deshalb ist der neue Zeilenbegrenzer etwas sicherer.
Auf BSD-Systemen können Sie die Option -0 verwenden, um neue Zeilenzeichen als Trennzeichen wie folgt zu verwenden:
quelle
xargs: illegal option -- d
-0
unter OS X gibt.xargs -I_ rm _
funktioniert auch unter OS X :) siehe stackoverflow.com/a/39335402/266309-d
), können Sie zuerst Zeilenumbrüche in Nullen konvertieren:tr '\n' '\0' < 1.txt | xargs -0 rm
Sie können diesen Einzeiler verwenden:
Dies führt zu einer Shell-Erweiterung, wird jedoch
rm
mindestens so oft ausgeführt.quelle
-n <n>
Argument hinzufügenxargs
, um die Anzahl der an jeden RM übergebenen Argumente zu verringern. Dies schützt Sie jedoch nicht vor einem einzelnen Glob, der das Limit überschreitet.xargs -I{} sh -c 'rm {}' < 1.txt
sollte tun was du willst. Seien Sie vorsichtig mit diesem Befehl, da ein falscher Eintrag in dieser Datei viele Probleme verursachen kann.Diese Antwort wurde bearbeitet, nachdem @tdavies darauf hingewiesen hatte, dass das Original keine Shell-Erweiterung durchgeführt hat.
quelle
xargs -I{} sh -c 'rm {}' < 1.txt
In diesem speziellen Fall würde ich aufgrund der in anderen Antworten genannten Gefahren
Bearbeiten Sie in z. B. Vim und
:%s/\s/\\\0/g
, wobei Sie alle Leerzeichen mit einem Backslash maskieren.Dann
:%s/^/rm -rf /
, das Voranstellen des Befehls. Mit-r
Sie müssen sich keine Sorgen machen Verzeichnisse haben aufgelistet , nachdem die darin enthaltenen Dateien, und mit-f
ihm wird nicht aufgrund von fehlenden Dateien oder doppelte Einträge beschweren.Führen Sie alle Befehle aus:
$ source 1.txt
quelle
cat 1.txt | xargs rm -f | bash
Wenn Sie den Befehl ausführen, wird Folgendes nur für Dateien ausgeführt.cat 1.txt | xargs rm -rf | bash
Wenn Sie den Befehl ausführen, wird das folgende rekursive Verhalten ausgeführt.quelle
Hier ist ein weiteres Schleifenbeispiel. Diese enthält auch eine 'if-Anweisung' als Beispiel für die Überprüfung, ob der Eintrag eine 'Datei' (oder beispielsweise ein 'Verzeichnis') ist:
quelle
Um einen anderen Weg zu finden, können Sie auch einfach den folgenden Befehl verwenden
quelle
Hier können Sie Reihe von Ordnern aus verwenden deletelist.txt während einige Muster zu vermeiden und
quelle
Dadurch können Dateinamen Leerzeichen enthalten (reproduzierbares Beispiel).
quelle
Falls jemand es bevorzugt
sed
und ohne Platzhaltererweiterung entfernt :Erinnerung: Verwenden Sie absolute Pfadnamen in der Datei oder stellen Sie sicher, dass Sie sich im richtigen Verzeichnis befinden.
Und der Vollständigkeit halber das Gleiche mit
awk
:Die Platzhaltererweiterung funktioniert, wenn die einfachen Anführungszeichen entfernt werden. Dies ist jedoch gefährlich, wenn der Dateiname Leerzeichen enthält. Dies müsste Anführungszeichen um die Platzhalter hinzufügen.
quelle