von der ältesten zur neuesten Datei im Verzeichnisbaum und interaktives Löschen jeder Datei

von der ältesten zur neuesten Datei im Verzeichnisbaum und interaktives Löschen jeder Datei

Im Schritt 1 versuche ich, die älteste Datei im Verzeichnisbaum zu finden, was ich wie folgt gelöst habediese Frage.

Nun möchte ich xargsinteraktiv vom Ältesten zum Neusten löschen.

Da dies find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -inicht funktioniert. Ich habe es in einem anderen Beitrag gesehen find . -type f -print0 | xargs -0 ls -rt, aber xargsdas Hinzufügen funktioniert 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 es sich hier nicht um ein Berechtigungsproblem handelt. Ich habe es /usr/share/doc/sambaals Beispiel verwendet, um die Veröffentlichung meiner echten Dateinamen zu vermeiden.

Beim Durchsuchen des Internets konnte ich kein Skript finden, das rekursiv (gesamter Baum) war, leere Dateizeichen verarbeitete und zudem interaktiv war. Also habe ich das hier erstellt. Dies würde nicht alle Arten von Sonderzeichen verarbeiten. Daher wäre jede Verbesserung willkommen.

#!/bin/bash
find -type f -printf '%T+ %p\n' | sort | head -n 3 > /tmp/1
cut -c32- /tmp/1 | awk '{print "rm -i", "\""$_"\""}'/tmp/2
bash /tmp/2

Antwort1

Die einzigen Problemzeichen, die ich in Ihrem Skript sehe, sind "und die neue Zeile. Sie sollten sich über die neue Zeile in einem Dateinamen nicht zu viele Gedanken machen.

Möglicherweise möchten Sie andere temporäre Dateinamen verwenden, beispielsweise 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. (Hinweis: Es gibt noch einige Probleme mit dem Skript. Es ist jedoch kein Problem, dies in Ihrer eigenen Heimumgebung zu tun. Und TMP in Großbuchstaben wird nicht empfohlen, aber ich mache es trotzdem.)

Hinweis: xargs -pFunktioniert nicht, wenn Ihre Dateinamen Leerzeichen enthalten.

Antwort2

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 maximal max-args-Argumente pro Befehlszeile.

-d delimEingabeelemente werden durch das angegebene Zeichen beendet.

verwandte Informationen