Risposte:
Questo comando stamperà i file lsofche richiedono il troncamento.
(In realtà non rimuove o tronca alcun file).
lsof restituirà un elenco di file aperti (descrittori di file) che vengono reindirizzati nel awk che lo elabora come segue.
gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
L'espressione sopra contiene due espressioni regolari separate da un punto e virgola ;
consideriamo la prima parte gawk '$4~/txt/{next};
Qui, se il quarto campo contiene, txtverrà letta la riga successiva di testo, che lo script inizierà a elaborare dall'inizio.
L' nextistruzione impone a awk di interrompere immediatamente l'elaborazione del record corrente e passare al record successivo. Ciò significa che non vengono eseguite ulteriori regole per il record corrente e il resto dell'azione della regola corrente non viene eseguito.
Ora consideriamo la seconda parte dello script /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Qui se la riga corrisponde all'espressione regolare /REG.*\(deleted\)$(il $mezzo che (deleted)dovrebbe essere l'ultima parola sulla riga), viene semplicemente stampata >/proc/%s/fd/%d\n", $2,$4.
Nel comando lsof $4è il numero del descrittore di file (ad esempio 53w, wsignifica che il filer è stato aperto per la scrittura) o il tipo di file, a seconda del file. Il %din printfassicura che verranno stampati solo i numeri, rimuovendo tutti i caratteri di testo (come il w). $2stampa l'identificativo del processo che utilizza il file in modo che stampi qualcosa di simile >/proc/3989/fd/53e così via stamperà tutti i file che sono stati eliminati ma il cui descrittore di file rimane aperto, in altre parole, descrittori di file che possono essere troncati in modo sicuro.
Questo comando tronca i file eliminati da lsof.
Questo primo elencherà i file apertilsof
quindi cerca ricorsivamente una riga, quindi una {next}che contenga REG '$4~/txt/{next};/REG.*\(deleted\)$/come quarto parametro, quindi questo processo relativo a questa riga verrà eliminato
e quindi stampare tutti i risultati senza le righe contenenti REG e contrassegnati come eliminati.{printf ">/proc/%s/fd/%d\n", $2,$4}'
sheffettivi. Devi passare questo comando a un troncamento effettivo e inoltre ci sono due espressioni regolari non una come nella tua spiegazione