älteste bis neueste Datei in der Verzeichnisstruktur und interaktiv löschen

556
Schultz Hartmut

In Schritt 1 versuche ich, die älteste Datei im Verzeichnisbaum zu finden, die ich durch Beantwortung dieser Frage gelöst habe .

Jetzt möchte ich xargsinteraktiv vom ältesten zum neuesten löschen.

Da klappt find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -idas nicht. Ich habe in einem anderen Beitrag gesehen, find . -type f -print0 | xargs -0 ls -rtaber das Hinzufügen xargsfunktioniert leider nicht.

pi@raspberrypi:/usr/share/doc/samba$ find . -type f -print0 | xargs -0 ls -rt | xargs -0 -d '\n' rm -i rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.oc.IBM-DS’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-netscapeds5.x.README’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema.IBMSecureWay’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-FDS.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.at.IBM-DS.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-nds.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/ol-schema-migrate.pl.gz’? rm: remove write-protected regular file ‘./examples/LDAP/get_next_oid’? rm: remove write-protected regular file ‘./README.Debian’? rm: remove write-protected regular file ‘./TODO.Debian’? rm: remove write-protected regular file ‘./NEWS.Debian.gz’? rm: remove write-protected regular file ‘./copyright’? rm: remove write-protected regular file ‘./changelog.Debian.gz’? rm: remove write-protected regular file ‘./examples/LDAP/README’? 

Bitte beachten Sie, dass dies kein Berechtigungsproblem ist. Ich habe /usr/share/doc/sambaals Beispiel verwendet, um zu vermeiden, dass meine tatsächlichen Dateinamen veröffentlicht werden.

Beim Durchsuchen des Internets konnte ich kein rekursives Skript (gesamter Baum) finden, das leere Zeichen und auch interaktive Zeichen verarbeitet. Also habe ich das gemacht. Dies würde nicht alle Arten von Sonderzeichen behandeln. Also würde jede Verbesserung akzeptiert werden.

#!/bin/bash find -type f -printf '%T+ %p\n' | sort | head -n 3 > /tmp/1 cut -c32- /tmp/1 | awk ''/tmp/2 bash /tmp/2 
0

2 Antworten auf die Frage

0
jhscheer

Du warst fast da.

Dies macht, was Sie wollen, und behandelt Leerzeichen in Dateinamen:

find -type f -printf '%T+ %p\n' | sort | cut -c32- | xargs -p -n1 -d '\n' rm

-p, --interactive: Fordern Sie den Benutzer auf, jede Befehlszeile auszuführen und eine Zeile vom Terminal zu lesen. Führen Sie die Befehlszeile nur aus, wenn die Antwort mit y oder Y beginnt.

-n max-args, --max-args=max-args: Verwenden Sie höchstens max-args-Argumente pro Befehlszeile.

-d delim Eingabeelemente werden durch das angegebene Zeichen beendet.

0
Ljm Dullaart

Die einzigen Problemzeichen, die ich in Ihrem Skript sehe, sind die "und die neue Zeile. Sie sollten sich nicht allzu viele Sorgen um die neue Zeile in einem Dateinamen machen.

Möglicherweise möchten Sie andere temporäre Dateinamen verwenden, z. B. mit einem $$im Dateinamen.

Also dann als Verbesserung:

#!/bin/bash TMP1=/tmp/file1.$$ TMP2=/tmp/file2.$$ find -type f -printf '%T+ %p\n' | sort | head -n 3 > $TMP1 cat $TMP1 | sed 's/"/\\"/g;s/[^ ]* //;s/^/rm -i "/;s/$/\"/' >$TMP2 bash $TMP2 rm -f $TMP1 $TMP2 

Dies sollte die Anführungszeichen in Ihrem Dateinamen behandeln. (Anmerkung: Es gibt immer noch Probleme mit dem Skript. Es ist jedoch in Ordnung, dies in der eigenen Umgebung zu tun. Und TMP in Großbuchstaben wird nicht empfohlen, aber ich mache das trotzdem.)

Hinweis: Funktioniert xargs -pnicht, wenn Sie Dateinamen mit Leerzeichen enthalten.