file dal più vecchio al più recente nella struttura di directory ed elimina ogni file in modo interattivo


0

Nel passaggio 1, sto cercando di "trovare" il file più vecchio nell'albero delle directory, che ho risolto seguendo questa domanda .

Ora voglio usare xargsper eliminare in modo interattivo dal più vecchio al più recente.

Dal momento che questo find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -inon funziona. Ho visto in un altro post find . -type f -print0 | xargs -0 ls -rtma aggiungerlo xargsnon funziona, purtroppo.

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’?

Si noti che questo non è un problema di autorizzazioni. Ho usato /usr/share/doc/sambacome esempio per evitare di pubblicare i miei nomi di file reali.

Cercando sul web, non sono riuscito a trovare alcun copione ricorsivo (albero intero), gestione di caratteri in bianco e anche interattivo. Quindi l'ho fatto. Ciò non gestirà tutti i tipi di caratteri speciali. Quindi qualsiasi miglioramento sarebbe accettato.

#!/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

Risposte:


0

Gli unici caratteri problematici che vedo nella tua sceneggiatura sono la "e la nuova riga. Non dovresti preoccuparti troppo della nuova riga in un nome di file.

È possibile che si desideri utilizzare diversi nomi di file temporanei, ad esempio con un $$nome nel file.

Quindi, come miglioramento:

#!/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

Questo dovrebbe gestire le virgolette nel nome del tuo file. (nota: ci sono ancora alcuni problemi con lo script. Va bene farlo nel proprio ambiente domestico. E TMP in maiuscolo non è raccomandato, ma lo faccio comunque.)

Nota: xargs -pnon funzionerà quando hai nomi di file con spazi.


0

Eri quasi lì.

Questo fa quello che vuoi e gestisce gli spazi bianchi nei nomi dei file:

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

-p, --interactive: Richiede all'utente se eseguire ciascuna riga di comando e leggere una riga dal terminale. Esegui la riga di comando solo se la risposta inizia con y o Y.

-n max-args, --max-args=max-args: Utilizza al massimo argomenti max-args per riga di comando.

-d delim Le voci di input sono terminate dal carattere specificato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.