2010-12-15 9 views
8

Ich habe einen Ordner, der einige Subversion Revision Checkouts enthält (diese werden ausgecheckt, wenn ein capistrano Deployment Rezept ausgeführt wird).So löschen Sie alle Dateien mit Ausnahme der letzten drei in einem Ordner

was ich wirklich tun möchte, ist, dass die neuesten 3 Revisionen, die das Capistrano Skript auscheckt und andere zu löschen, so dass ich plane, einen Befehl auf dem Terminal mit einem run-Befehl auszuführen, tatsächlich capistrano hasn ' Ich habe hier etwas zu tun, aber einen Unix-Befehl.

Ich habe versucht, einen Befehl auszuführen, um eine Liste von Dateien mit Ausnahme der neuesten drei zu erhalten und den Rest zu löschen, konnte ich die Liste der Dateien mit dem folgenden Befehl abrufen.

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs 

jetzt, wenn ich hinzufügen, ein rm -rf bis zum Ende dieses Befehls es mich mit Datei kehrt nicht löschen gefunden. Das ist offensichtlich, da nur der Name des Ordners und nicht der vollständige Pfad zum Ordner zurückgegeben wird.

gibt es trotzdem, diese Dateien/Ordner mit einem Unix-Befehl zu löschen?

Antwort

13

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 
+0

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

+0

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

+0

hi, das mache ich ls -t1/var/pfad/zu/ordner | Schwanz -n +4 | xargs rm -r – nivanka

0

Hallo fand ich einen Weg, dies zu tun wir das Unix & &

so der Befehl wie dieses Below

cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 
1

aussehen wird verwenden können, ist ein nützliche Art, die Aufgabe zu erledigen ....... !!

für Linux und HP-UX:

ls -t1 | Schwanz -n +50 | xargs rm -r # um die letzten 50 Dateien/Verzeichnisse zu verlassen.

für SunOS:

rm `(ls -t | head -n 100; ls) | Art | uniq -u` gibt

Verwandte Themen