[bash] Dateiliste kürzen und Rest löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

[bash] Dateiliste kürzen und Rest löschen

Beitrag von MoonKid » 12.03.2012 22:48:51

Ich möchte in einem Verzeichnis alle Dateien, ausgenommen die 4 neuesten (modification time), löschen. Was wäre hier der eleganteste Ansatz?

Ich versuche gerade von einer mit ls nach modification time sortierte Dateiliste mit sed um die ersten n Einträge zu kürzen und die restlichen Dateinamen dann zum Aufruf von rm zu verwenden.

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: Alles auswählen

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}
rm meint aber die Dateien nicht finden zu können.

Code: Alles auswählen

$ ./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
Wenn ich die beiden auskommentierten Zeilen mitlaufen lasse, also das lezte Zeichen abschneide

Code: Alles auswählen

rm: Entfernen von „z015.jpg z019.jpg z017.jpg z014.jpg z011.jpg 
z016.jpg“ nicht möglich: No such file or directory
    	^
Wenn ich den rm-Befehl mit diesen Dateien von Hand eingeben, funktioniert er problemlos.

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: [bash] Dateiliste kürzen und Rest löschen

Beitrag von Livingston » 12.03.2012 23:08:40

Mal ein Schuss ins Blaue: Kann es sein, daß nur ein Parameter von " bis " übergeben wird?

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] Dateiliste kürzen und Rest löschen

Beitrag von MoonKid » 12.03.2012 23:21:48

Sorry, ich versteh die Frage grad nicht. ;)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [bash] Dateiliste kürzen und Rest löschen

Beitrag von Cae » 12.03.2012 23:44:02

Livingston hat geschrieben:Mal ein Schuss ins Blaue: Kann es sein, daß nur ein Parameter von " bis " übergeben wird?
Das ist korrekt, rm bekommt genau ein Argument mitgeteilt, also foo.bar\ bar.foo\ foobar.foo. Eine Datei dieses Namens gibt's natürlich nicht.
Ich würde eine Schleife bauen:

Code: Alles auswählen

#!/bin/sh

for file in $(ls $1 -1t | sed '1,4d'); do
        rm -vi "$file"
done
Wenn's passt, kannst du rm nicht quengeln lassen, indem du das i als Parameter entfernst. Übrigens kann auch find nach Änderungsdaten sortieren und mit -print0 sauber per \0 an xargs -0 weitergeben.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] Dateiliste kürzen und Rest löschen

Beitrag von MoonKid » 12.03.2012 23:51:01

Cae hat geschrieben:rm bekommt genau ein Argument mitgeteilt, also foo.bar\ bar.foo\ foobar.foo. Eine Datei dieses Namens gibt's natürlich nicht.
Ich verstehe schon was du meinst, aber ich verstehe die Logik dahinter nicht.

Wenn ich manuell "rm file1 file2 file3" in die shell haue, geht es doch auch und für rm sind das drei Argumente.
Warum ist es für rm nur ein Argument, wenn ein Script ihm die drei Argumente übergibt?
Cae hat geschrieben:Übrigens kann auch find nach Änderungsdaten sortieren und mit -print0 sauber per \0 an xargs -0 weitergeben.
Mit xargs muss ich mich mal beschäftigen. Sehe noch nicht, wozu ich das brauche.

Mit find hatte ich beschäftigt. Hier finde ich aber nur Funktionen, um nach dem Dateialter und nicht deren Anzahl zu suchen.
Also alle Dateien älter als 30 Tage beispielsweise. Das hilft mir aber nicht. Ich will nicht das konkrete Alter angeben. Es geht darum, das eine bestimmte Anzahl der neusten Dateien erhalten und der Rest verworfen werden soll. Wie "alt" dabei diese neusten Dateien bzw. die anderne zuverwerfenden sind, weiß ich nicht und variiert stark.
Hab ich evtl. doch eine Option bei find übersehen?

Antworten