Ich habe mich für einen sichereren und viel, viel schnelleren Ansatz entschieden, weil ich 18.000 Dateien in der Liste hatte! Ich musste Bilder in einer großen Drupal-Installation bereinigen.
Das Löschen aller Dateien, die nicht in der Liste enthalten sind, entspricht dem Beibehalten nur der Dateien, die in der Liste enthalten sind. Daher habe ich beschlossen, die Dateien tatsächlich von der Liste an einen anderen Speicherort zu kopieren, aber das Kopieren von 20 GB Dateien würde zu viel Speicherplatz beanspruchen und auch sehr langsam sein. Der Trick besteht also darin, die Dateien hardlinks
stattdessen mit der -l
Option zu kopieren cp
. Dies nimmt fast keinen Platz ein und ist sehr schnell. Da ich die Verzeichnisstruktur beibehalten musste, habe ich außerdem die --parents
Option verwendet.
Hier ist ein Auszug aus meiner Dateiliste:
1px.png
misc/feed.png
modules/file/icons/x-office-presentation.png
modules/file/icons/x-office-spreadsheet.png
newsletter.png
sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png
sites/all/libraries/ckeditor/plugins/smiley/images/regular_smile.png
sites/default/files/009313_PwC_banner_CBS_Observer_180x246px.jpg
Eine Beispielzeile wäre also, wobei Temp das Ziel ist:
cp -l --parents 'misc/feed.png' temp
Dadurch wird diese Struktur erstellt:
temp
misc
feed.png
Beachten Sie, dass sich das Ziel im selben Dateisystem wie die Quelle befinden muss, damit Hardlinks funktionieren.
Der nächste Schritt besteht darin, das Skript zu erstellen:
sed -e "s,^,cp -l --parents '," -e "s,$,' /some/where/temp," filelist > newfilelist
Angenommen, Sie haben bereits das leere Verzeichnis / some / where / temp erstellt, können Sie die Dateien folgendermaßen kopieren:
sh newfilelist 2> missing_files
Beachten Sie, wie Fehler enden missing_files
. Der zusätzliche Vorteil dieses Ansatzes besteht darin, dass Sie eine Liste der Dateien aus der ursprünglichen Liste erhalten, die tatsächlich nicht vorhanden sind!
Nach dem Ausführen des Skripts enthält temp nur die Dateien, die in der Dateiliste enthalten sind, ohne jedoch etwas zu löschen und ohne zusätzlichen Speicherplatz zu beanspruchen. Wenn Sie mit dem Ergebnis zufrieden sind, können Sie alle Originaldateien einschließlich der Unterordner löschen.
Verschieben Sie abschließend die Dateien und Ordner von temporär an den ursprünglichen Speicherort zurück.
Für die 18.000 Dateien dauerte es nur wenige Sekunden.