Ich brauchte eine elegante Lösung für die Busybox (Router), alle Xargs- oder Array-Lösungen waren für mich nutzlos - dort war kein solcher Befehl verfügbar. find and mtime ist nicht die richtige Antwort, da es sich um 10 Elemente handelt und nicht unbedingt um 10 Tage. Espos Antwort war die kürzeste und sauberste und wahrscheinlich die unversalste.
Fehler mit Leerzeichen und wenn keine Dateien gelöscht werden sollen, werden beide einfach auf die Standardmethode gelöst:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Etwas lehrreichere Version: Wir können alles machen, wenn wir awk anders verwenden. Normalerweise verwende ich diese Methode, um Variablen von der awk an die sh zu übergeben (zurückzugeben). Da wir die ganze Zeit lesen, was nicht möglich ist, möchte ich mich unterscheiden: Hier ist die Methode.
Beispiel für .tar-Dateien ohne Probleme hinsichtlich der Leerzeichen im Dateinamen. Ersetzen Sie zum Testen "rm" durch "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Erläuterung:
ls -td *.tar
listet alle .tar-Dateien nach Zeit sortiert auf. Entfernen Sie den Teil "d * .tar", um ihn auf alle Dateien im aktuellen Ordner anzuwenden
awk 'NR>7...
überspringt die ersten 7 Zeilen
print "rm \"" $0 "\""
erstellt eine Zeile: rm "Dateiname"
eval
führt es aus
Da wir verwenden rm
, würde ich den obigen Befehl nicht in einem Skript verwenden! Klügere Verwendung ist:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
Im Falle der Verwendung von ls -t
Befehl wird solchen dummen Beispielen wie: touch 'foo " bar'
und kein Schaden zugefügttouch 'hello * world'
. Nicht, dass wir jemals Dateien mit solchen Namen im wirklichen Leben erstellen würden!
Randnotiz. Wenn wir auf diese Weise eine Variable an sh übergeben möchten, ändern wir einfach den Druck (einfache Form, keine Leerzeichen toleriert):
print "VarName="$1
um die Variable VarName
auf den Wert von zu setzen $1
. Es können mehrere Variablen auf einmal erstellt werden. Dies VarName
wird zu einer normalen sh-Variablen und kann anschließend normalerweise in einem Skript oder einer Shell verwendet werden. So erstellen Sie Variablen mit awk und geben sie an die Shell zurück:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"