2015-12-17 8 views
5

Es gibt verschiedene Themen in stackoverflow bezüglich Suchen/Entfernen des ältesten Verzeichnisses/Dateien in einem Verzeichnis. Ich habe viele von ihnen gelesen und unzählige verschiedene Arten gesehen, die offensichtlich für einige Leute auf anderen Systemen funktionieren, aber nicht für mich in meinem speziellen Fall.Entfernen aller bis auf X ältesten Verzeichnisse auf FreeBSD via Bash (no -printf, mit Leerzeichen, keine zsh)

Die Einschränkungen sind:

  • Im auf FreeBSD (Freenas 9.3)
  • Verzeichnisse Leerzeichen in ihnen
  • Dont verwenden ls (http://mywiki.wooledge.org/ParsingLs)
  • nicht -printf von find (doesnt verwenden können, existieren für mich)

Die nächste, die ich bekommen habe, ist etwas wie das (nicht vollständig):

find . -maxdepth 1 -d -name "Backup Set*" -print0 | xargs -0 stat -f "%m %N" | sort -r| awk 'NR>5' 

Das gibt mir die Verzeichnisse, die ich aber jetzt löschen wollen sie Zeitstempel vorangestellt haben, die ich bin nicht sicher, dass, wenn ich i zu einer Situation wird abzustreifen und Rohr rm zurück, wo ich Verzeichnisse nicht löschen mit Räumen in ihnen.

Ausgabe:

1450241540 ./Backup Set1 
1450241538 ./Backup Set0 

Vielen Dank für jede hier Hilfe.


relevante Beiträge, die ich ausgesehen haben:

https://superuser.com/questions/552600/how-can-i-find-the-oldest-file-in-a-directory-tree

Bash scripting: Deleting the oldest directory

Delete all but the most recent X files in bash

+0

sein wird, funktioniert die 'stat 'Ausgabe ließ Sie zusätzliche dbl-Anführungszeichen setzen, dh' stat -f "% m \"% N \% "" '? Gutes Q, Viel Glück. – shellter

Antwort

3
... | awk 'NR>5' | while read -r timestamp filename; do rm -rf "${filename}"; done 

Wenn es mehr Felder als in read angegebenen Variablen, die remaind er wird einfach in der letzten angegebenen Variable zusammengelegt. In unserem Fall extrahieren wir den Zeitstempel und verwenden für den Dateinamen alles andere wie es ist. Wir iterieren die Ausgabe und führen einen rm für jeden Eintrag aus.

Ich würde empfehlen, einen Testlauf mit echo anstelle von rm, so dass Sie die Ergebnisse zuerst überprüfen können.


Alternativ, wenn Sie eine xargs -0 Version bevorzugen würden:

... | awk 'NR>5' | while read -r timestamp filename; do printf "%s\0" "${filename}"; done | xargs -0 rm -rf 

Dies nutzt auch die while read aber druckt jeden Dateinamen mit einem Null-Byte-Trennzeichen, die von xargs -0 aufgenommen werden kann.

+0

Danke dafür, ich habe das erste versucht und es funktioniert - mit der Einschränkung, dass Sie es von einem Skript ausführen müssen, konnte ich es nicht direkt von der Befehlszeile ausführen, wie ich meine Befehle auf diese Weise getestet hatte. – skimon

0

diesen Schnitt Befehl kochend cut -d ' ' -f 2- wird der Zeitstempel

einfaches Beispiel aus

echo '1450241538 ./Backup Set0'|cut -d ' ' -f 2- 

wird der Zeitstempel loszuwerden

Ergebnisse

./Backup Set0