rm60()( IFS=/; set -f; set $(
set +f; \ls -1drt ./*)
while shift &&
[ $# -gt 60 ]
do [ -d "${1%?.}" ] ||
rm "./${1%?.}" || exit
done
)
Dies wird für Sie funktionieren. Es werden die ältesten Dateien im aktuellen Verzeichnis bis zu einer Zählung von 60. löschen Sie dies tun , werden durch das Parsen ls
robust , und es wird es tun , ohne irgendwelche Annahmen über Ihre Dateinamen zu machen - sie könnten etwas genannt werden und müssen nicht durch Daten genannt werden. Dies funktioniert nur für eine Auflistung des aktuellen Verzeichnisses und für den Fall, dass Sie ein POSIX ls
installiert haben (und nicht durch eine böse Shell-Funktion maskiert alias
sind , aber es wird abgedeckt) .
Die obige Lösung wendet nur einige sehr grundlegende Shell-Aufteilungen auf einige sehr grundlegende Unix-Pfadnamen an. Es stellt sicher, dass ls
alle Nicht-Punkt-Dateien im aktuellen Verzeichnis eine pro Zeile wie folgt aufgelistet werden:
./oldestfile
./second-oldestfile
Nun, jeder von ihnen könnte auch neue Zeilen dazwischen haben, aber das wäre kein Problem. Denn in diesem Fall würden sie wie folgt aufgelistet:
./oldest
file
./s
econd
old
est
file
./third
...und so weiter. Und die Zeilenumbrüche stören uns sowieso nicht - weil wir uns nicht auf sie aufteilen. Warum sollten wir? Wir arbeiten mit Pfadnamen, wir sollten uns auf den Pfadbegrenzer aufteilen, und so machen wir das : IFS=/
.
Das klappt ein bisschen komisch. Am Ende haben wir eine Argumentliste, die so aussieht:
<.> <file1\n.> <file2\n.> ... <filelast>
... aber das ist eigentlich sehr gut für uns, weil wir unsere Argumente, die von der Shell als Dateien behandelt werden (oder, falls wir dies vermeiden möchten, Symlinks) , so lange verzögern können , bis wir dazu bereit rm
sind.
Sobald wir unsere Dateiliste haben, müssen wir nur noch shift
unser erstes Argument entfernen. Überprüfen Sie, ob wir derzeit mehr als 60 Argumente haben, und lehnen Sie es wahrscheinlich in rm
ein untergeordnetes Verzeichnis ab (obwohl das natürlich ganz bei Ihnen liegt). und ansonsten rm
unser erstes Argument abzüglich der letzten beiden Zeichen. Wir haben keine Sorgen zu machen über die letzte letzte Argument - die aus der Anlage ersichtliche Zeit nicht hat - weil wir nie dorthin zu gelangen, und stattdessen bei 60 beenden Wenn wir es bis hierher für eine Iteration gemacht haben , dann haben wir einfach versuchen Sie es erneut und durchlaufen Sie die Arg-Liste auf diese Weise, bis wir sie zu unserer Zufriedenheit beschnitten haben.
Wie bricht das? Meines Wissens nicht, aber ich habe es zugelassen - wenn zu irgendeinem Zeitpunkt ein unerwarteter Fehler auftritt, bricht die Schleife und die Funktion gibt eine andere als 0 zurück.
Und so ls
können Sie Ihre Auflistung im aktuellen Verzeichnis ohne Probleme für Sie erledigen. Sie können es zulassen, dass Ihre Argumente für Sie sortiert werden, solange Sie sie zuverlässig abgrenzen können. Aus diesem Grund funktioniert dies nur für das aktuelle Verzeichnis wie geschrieben - mehr als ein Trennzeichen in einer Pfadzeichenfolge würde eine andere Begrenzungsstufe erfordern, die durch doppeltes Ausklammern für alle außer dem letzten in NUL-Felder erfolgen könnte , aber das ist mir jetzt egal.
ls
Optionen-lrt
und um eine Liste in der for-Schleife zu erstellen, benötigen Sie keinels
Option-1
. Freie Variablenerweiterungen ("$dir"
und"$part"
) sollten in Anführungszeichen gesetzt werden. Anstelle der Backtics verwenden$(ls | wc -l)
.