Ich muss regelmäßig einen Ordner bereinigen. Ich bekomme eine Dateiliste, die Text enthält, welche Dateien erlaubt sind. Jetzt muss ich alle Dateien löschen, die nicht in dieser Datei sind.
Beispiel:
dont-delete.txt
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Mein Ordner "Bereinigen" enthält Folgendes als Beispiel:
ls /home/me/myfolder2tocleanup/
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Also sollten diese Dateien gelöscht werden:
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Ich suche etwas, um einen Löschbefehl mit einer Option zum Ausschließen einiger von file bereitgestellter Dateien zu erstellen.
command-line
bash
scripts
rm
stefan83
quelle
quelle
Antworten:
Der
rm
Befehl ist auskommentiert, damit Sie überprüfen und sicherstellen können, dass er bei Bedarf funktioniert. Dann entkommentieren Sie diese Zeile einfach.In diesem
check directory
Abschnitt wird sichergestellt, dass Sie das Skript nicht versehentlich aus dem falschen Verzeichnis ausführen und die falschen Dateien löschen.Sie können die
echo deleting
Linie entfernen, um im Hintergrund zu laufen.quelle
ls
und die nutzlose Erfassung der Ausgabe von zu vermeiden,grep
wenn Sie nur wissen möchten, ob eine Übereinstimmung vorliegt oder nicht. Ich habe auch feste Zeichenfolgen verwendet, um Probleme zu vermeiden.while
Schleife in einefor
Schleife geändert haben, haben Sie versehentlich die Einstellungiteration key
voni
auf geändertf
. in der Deklaration, die den Code brach. Ich habe es repariert.f
. ;-P (… und +1 für deine Antwort, die ich vorher vergessen habe.)Dieses Python-Skript kann dies tun:
Ein wichtiger Teil ist das Auskommentieren der
os.unlink()
Funktion.HINWEIS : Fügen Sie dieses Skript und
dont-delete.txt
zu Ihrem hinzu,dont-delete.txt
sodass beide in der Liste enthalten sind, und bewahren Sie sie im selben Verzeichnis auf.quelle
set
anstelle einer Liste für O (1) anstelle von O (n) eine Suche im zweiten Teil zu verwenden.Hier ist ein Einzeiler:
ls
druckt alle Dateien im aktuellen Verzeichnis (in sortierter Reihenfolge)sort dont_delete
druckt alle Dateien, die nicht gelöscht werden sollen, in sortierter Reihenfolge<()
Operator verwandelt eine Zeichenfolge in ein dateiähnliches Objektcomm
Befehl vergleicht zwei vorsortierte Dateien und druckt Zeilen aus, in denen sie sich unterscheiden-2 -3
Flags verwendencomm
, werden nur die Zeilen gedruckt, die in der ersten, nicht aber in der zweiten Datei enthalten sind. Dies ist die Liste der Dateien, die sicher gelöscht werden könnentail +2
Aufruf besteht lediglich darin, die Überschrift dercomm
Ausgabe zu entfernen , die den Namen der Eingabedatei enthältxargs
um den Ausgabestream in eine Liste von Argumenten für zu verwandelnrm
. Die-p
Optionxargs
fordert vor der Ausführung eine Bestätigung an.quelle
FWIW sieht es so aus, als ob Sie dies von Haus aus
zsh
mit dem(+cmd)
Glob-Qualifikator tun können .Beginnen wir zur Veranschaulichung mit einigen Dateien
und eine Whitelist-Datei
Lesen Sie zuerst die Whitelist in ein Array:
oder vielleicht besser
(das Äquivalent zu
mapfile
bashs builtin - oder seinem Synonymreadarray
). Jetzt können wir überprüfen, ob ein Schlüssel (Dateiname) im Array vorhanden ist,${keepfiles[(I)filename]}
der 0 zurückgibt, wenn keine Übereinstimmung gefunden wird:Wir können dies verwenden, um eine Funktion zu erstellen, die zurückgibt,
true
wenn$REPLY
das Array keine Übereinstimmungen für enthält :Schließlich verwenden wir diese Funktion als Qualifikationsmerkmal in unserem Befehl:
oder in deinem Fall
(Wahrscheinlich möchten Sie den Namen der Whitelist-Datei selbst zur Whitelist hinzufügen.)
quelle
Angenommen, Ihre Bash-Shell hat den
extglob
shopt
Wert on, dann ist dies eine etwas konservativere Alternative:(... zu @ gardenheads sonst hervorragendem Kommunikationsvorschlag!)
quelle
Angenommen, Ihre Dateien enthalten keine Leerzeichen (Leerzeichen / Tabulatoren) in einer Datei namens
list
. Dann würden Sie Folgendes tun:Fügen Sie einfach
-delete
auf den Befehl über die Dateien zu löschen , die nicht in der existieren Liste Datei. Wenn Ihr Fund nicht über-delete
Option können Sie verwenden ,rm
mit ,-exec
wie folgend:Oder stattdessen
-exec
mit+
Terminator verwenden.echo
wird nur zum Trockenlaufen verwendet.quelle
Es sei denn, die Ausgabe von
ls /home/me/myfolder2tocleanup/
überschreitet die maximale Grenze für Shell-ArgumenteARG_MAX
, die um ist 2MB für Ubuntu, würde ich folgendes vorschlagen.Eine einzeilige Befehlsimplementierung, die die Aufgabe erledigt, wäre wie folgt:
dont-delete.txt
Datei in das Verzeichnis mit den zu löschenden Dateien wie folgt:cd
in das Verzeichnis mit den zu löschenden Dateien wie folgt:quelle
Mein Vorschlag ist:
Update 2018-08-07
Beispiel:
Beachten Sie nach Zeile 3, dass Sie die
dont-delete.txt
Datei mit dem Inhalt haben:(Die Führung
./
ist sehr wichtig )Die Dateien
c
undd
werden gelöscht.quelle