So löschen Sie alle Dateien mit Ausnahme der letzten drei in einem Ordner

8

Ich habe einen Ordner, der einige Subversion-Revisions-Checkouts enthält (diese werden ausgecheckt, wenn ein Capistrano-Deployment-Rezept ausgeführt wird).

was ich wirklich tun möchte, ist, dass ich die letzten drei Überarbeitungen, die das capistrano-Skript auscheckt und andere lösche, behalte, deshalb plane ich, einen Befehl auf dem Terminal mit einem run-Befehl auszuführen, eigentlich hat capistrano das nicht habe hier etwas zu tun, aber einen Unix-Befehl.

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

%Vor%

jetzt, wenn ich am Ende dieses Befehls eine Rm -Rf hinzufügen, gibt es mich mit der Datei nicht gefunden zu löschen. Das ist offensichtlich, da nur der Name des Ordners und nicht der vollständige Pfad zum Ordner zurückgegeben wird.

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

    
nivanka 15.12.2010, 06:32
quelle

3 Antworten

13

Okay, es gibt ein paar Dinge, die mit Ihrem Skript nicht stimmen.

Zuerst und am problematischsten ist diese Zeile:

%Vor%

ls -t gibt eine Liste der Dateien in der Reihenfolge ihrer letzten Änderungszeit zurück, beginnend mit zuletzt geändert . 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", was ich nicht glaube was du willst.

Ich bin nicht wirklich sicher, was Sie mit dem zweiten ls -Befehl machen, aber ich bin mir ziemlich sicher, dass das nur alle Dateien im Verzeichnis in Ihre Liste verketten wird. Das bedeutet, wenn Sie sort ed und uniq 'ed erhalten haben, bleibt nur eine alphabetische Liste aller Dateien in diesem Verzeichnis übrig. Wenn dies an etwas wie xargs rm weitergegeben wird, löschst du alles in diesem Verzeichnis.

Als nächstes benötigt sort | uniq nicht den uniq -Teil. Sie können einfach den Schalter -u auf sort verwenden, um Duplikate loszuwerden. Du brauchst diesen Teil sowieso nicht.

Zum Schluss das eigentliche Entfernen des Verzeichnisses. Auf diesem Teil hatten Sie es richtig in Ihrer Frage: Verwenden Sie einfach rm -r

Hier ist der einfachste Weg, um dies zu tun:

%Vor%

Hier ist was hier passiert:

  • ls -t1 druckt eine Liste, eine Datei / ein Verzeichnis pro Zeile, aller Dateien in /var/path/to/folder , sortiert nach dem letzten Ä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 eine Dateiausgabe von tail zu löschen. % Co_de% bedeutet, dass Dateien rekursiv gelöscht werden. Wenn ein Verzeichnis gefunden wird, wird alles in diesem Verzeichnis gelöscht und das Verzeichnis selbst gelöscht.

Beachten Sie, dass ich nichts sortiere oder Duplikate lösche. Das ist weil:

  • -r meldet nur einmal eine Datei, daher gibt es keine zu entfernenden Duplikate
  • Sie löschen jede Datei, die sowieso übergeben wird, daher spielt es keine Rolle, in welcher Reihenfolge sie gelöscht wird.

Macht das alles Sinn?

Bearbeiten:

Da ich falsch war, weil ls den vollständigen Pfad angibt, wenn ein absolutes Verzeichnis übergeben wurde, und da Sie möglicherweise ls nicht ausführen können, könnten Sie stattdessen cd verwenden.

Zum Beispiel:

%Vor%     
AgentConundrum 15.12.2010, 07:49
quelle
1

Unten ist eine 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) | sortieren | uniq -u'

    
Mubasheer Ahmed 16.02.2014 00:15
quelle
0

Hi, ich habe einen Weg gefunden, dies zu tun, wir können das Unix & amp; & amp;

verwenden

, damit der Befehl so aussieht

%Vor%     
nivanka 17.12.2010 07:05
quelle

Tags und Links