
Im Schritt 1 versuche ich, die älteste Datei im Verzeichnisbaum zu finden, was ich wie folgt gelöst habediese Frage.
Nun möchte ich xargs
interaktiv vom Ältesten zum Neusten löschen.
Da dies find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -i
nicht funktioniert. Ich habe es in einem anderen Beitrag gesehen
find . -type f -print0 | xargs -0 ls -rt
, aber xargs
das 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/samba
als 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 -p
Funktioniert 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 delim
Eingabeelemente werden durch das angegebene Zeichen beendet.