In Ordnung, es gibt ein paar Dinge, die mit Ihrem Skript nicht stimmen.
Zuerst und am problematically, ist diese Zeile:
ls -t /var/path/to/folder |head -n 3;
ls -t
wird eine Liste der Dateien in der Reihenfolge ihrer letzten Änderung zurückkehren, beginnend mit dem zuletzt modifizierten. head -n 3
sagt, nur die ersten drei Zeilen aufzulisten. Also, was das sagt, ist "gib mir eine Liste von nur die drei zuletzt geänderten Dateien", die ich glaube nicht, was Sie wollen.
Ich bin nicht wirklich sicher, was Sie mit dem zweiten ls
Befehl tun, aber ich bin mir ziemlich sicher, dass nur alle Dateien im Verzeichnis in Ihre Liste verketten wird. Das heißt, wenn es sort
Ed und uniq
'ed, erhalten Sie nur eine alphabetische Liste aller Dateien in diesem Verzeichnis. Wenn dies an etwas wie xargs rm
weitergegeben wird, löschen Sie alles in diesem Verzeichnis.
Als nächstes benötigt sort | uniq
nicht den uniq
Teil. Sie können einfach den -u
Schalter auf sort
verwenden, um Duplikate loszuwerden. Du brauchst diesen Teil sowieso nicht.
Schließlich die tatsächliche Entfernung des Verzeichnisses. An diesem Teil es, Sie hatten Recht in Frage: Hier ist der einfachste Weg, nur rm -r
verwenden Ich denke, dies zu tun:
ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r
Hier ist, was passiert hier:
ls -t1
ist Drucken einer Liste, einer Datei/eines Verzeichnisses pro Zeile aller Dateien in /var/path/to/folder
, Bestellung durch das neueste Änderungsdatum.
tail -n +4
druckt alle Zeilen in der Ausgabe von ls -t1
beginnend mit der vierten Zeile (d. H.Die drei zuletzt geänderten Dateien werden nicht aufgelistet)
xargs rm -r
sagt, um jede Dateiausgabe von der tail
zu löschen. Die -r
bedeutet, Dateien rekursiv zu löschen. Wenn es also auf ein Verzeichnis stößt, löscht es alles in diesem Verzeichnis und löscht dann das Verzeichnis selbst.
Beachten Sie, dass ich nichts sortiere oder Duplikate entferne. Das ist, weil:
ls
eine Datei nur einmal berichtet, so gibt es keine Duplikate
- entfernen Sie alle Dateien ohnehin vergangen löschen, so spielt es keine Rolle, in welcher Reihenfolge sie gelöscht sind.
Macht das alles Sinn?
Edit:
Da ich über ls
falsch war, den vollständigen Pfad angeben, wenn ein absolutes Verzeichnis übergeben, und da Sie kein cd
ausführen könnte der Lage sein, vielleicht könnten Sie tail
stattdessen verwenden.
Zum Beispiel:
ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r
Hallo Danke für die Antwort, aber immer noch bekomme ich die Datei Nur einer der Hauptnotwendigkeiten ist, diesen Code von jedem Verzeichnis des Servers auszuführen und die Dateien in diesem var/path/to/Ordner zu entfernen. Dies funktioniert gut, wenn ich im selben Ordner bin/Pfad/zu/Ordner – nivanka
bin @nivanka: Das ist wirklich komisch. Spezifizieren Sie einen relativen oder absoluten Pfad? Sie müssen einen absoluten Pfad angeben, wenn Sie dies von einem beliebigen Verzeichnis auf dem Server ausführen möchten. Können Sie den * exact * -Befehl, den Sie verwenden, kopieren/einfügen? – AgentConundrum
hi, das mache ich ls -t1/var/pfad/zu/ordner | Schwanz -n +4 | xargs rm -r – nivanka