expertenaustausch > alt.* > alt.comp.cygwin+co

Christian Buhtz (12.03.2012, 17:31)
Ich lasse mir mit
ls -1t
Dateien (z.B. 100 stück) sortiert nach Datum ausgeben.

Ich möchte die ersten 10 (also die jüngsten Dateien), aus der Liste
entfernen und den Rest der übrig bleibt dann mit rm zu killen.

Sicherlich könnte ich im Script einfach die ersten 10
Schleifendurchgänge zählen und nix tun. Aber es gibt doch sicherlich
eine elegantere Lösung, oder?
Christian Buhtz (12.03.2012, 18:29)
Am 12.03.2012 16:31, schrieb Christian Buhtz:
> Sicherlich könnte ich im Script einfach die ersten 10
> Schleifendurchgänge zählen und nix tun. Aber es gibt doch sicherlich
> eine elegantere Lösung, oder?


Hätte ich vorher mal ausprobieren sollen.
Ein ls -1t auf der bash macht ne zeilenweise ausgabe (jede Datei eine
Zeile).

Mache ich allerdings eine Zuweisung und Ausgabe im Script, stehen da nur
Leerzeichen zwischen den Dateinamen und sie werden alle in der gleichen
Zeile ausgegeben.

my_liste=$(ls ${1} -1t)
echo ${my_liste}

Ok, vielleicht ist das der falsche Ansatz?

Anders gefragt:
Ich möchte in einem Verzeichnis alle Dateien, ausgenommen die 10
neuesten (modification time), löschen. Was wäre hier der eleganteste Ansatz?
Christian Buhtz (12.03.2012, 18:39)
Am 12.03.2012 17:29, schrieb Christian Buhtz:
> Anders gefragt:
> Ich möchte in einem Verzeichnis alle Dateien, ausgenommen die 10
> neuesten (modification time), löschen. Was wäre hier der eleganteste
> Ansatz?


Vielleicht sollte ich noch hinzufügen, dass es hier wirklich um die
Anzahl geht.
Also ein "find" würde hier nicht helfen, weil dies nur das Alter
berücksichtigt.

Ich möchte also nicht Dateien löschen, die Älter als X Tage sind,
sondern einfach die 10 neusten behalten und den Rest rauswerfen.
Christian Buhtz (12.03.2012, 20:30)
Am 12.03.2012 17:29, schrieb Christian Buhtz:
> Ich möchte in einem Verzeichnis alle Dateien, ausgenommen die 10
> neuesten (modification time), löschen. Was wäre hier der eleganteste
> Ansatz?


Also mein Ansatz ist foglender, wobei ich allerdings denke, dass hier in
meinem String irgendwie ein nicht-sichtbares Zeichen (escape-sequence?)
entsteht, welche rm verwirrt.

[code]
IFS=`
`
# ls: Dateien nach Datum sortiert
# sed: die erste (also jüngsten) vier Einträge löschen
# tr: Zeilenumbrüche durch Leerzeichen ersetzen
my_liste=$(ls ${1} -1t | sed '1,4d' | tr '\n' ' ')

# letztes Zeichen (welches???) entfernen
#my_liste_length=${#my_liste}
#my_liste=${my_liste:0:my_liste_length-1}

rm -v $my_liste

echo ${my_liste}
[/code]

rm meint aber die Dateien nicht finden zu können.
[out]
$ ./kill.sh "*z01*"
rm: Entfernen von ?z015.jpg z019.jpg z017.jpg z014.jpg z011.jpg z016.jpg
? nicht möglich: No such file or directory
z015.jpg z019.jpg z017.jpg z014.jpg z011.jpg z016.jpg
[/out]

Wenn ich die beiden auskommentierten Zeilen mitlaufen lasse, also das
lezte Zeichen abschneide
[out]
rm: Entfernen von ?z015.jpg z019.jpg z017.jpg z014.jpg z011.jpg
z016.jpg? nicht möglich: No such file or directory
^
[/out]

Wenn ich den rm-Befehl mit diesen Dateien von Hand eingeben,
funktioniert er problemlos.
Ähnliche Themen