Jawaban:
Perintah ini akan mencetak file dari lsofyang perlu dipotong.
(Ini sebenarnya tidak menghapus atau memotong file apa pun).
lsof akan mengembalikan daftar file terbuka (deskriptor file) yang disalurkan ke awk yang memprosesnya sebagai berikut.
gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Ekspresi di atas berisi dua ekspresi reguler yang dipisahkan oleh titik koma ;
mari pertimbangkan bagian pertama gawk '$4~/txt/{next};
Di sini, jika bidang ke-4 berisi txtmaka baris teks berikutnya akan dibaca, yang skrip akan mulai memproses dari awal lagi.
The nextpasukan pernyataan awk untuk segera menghentikan proses rekor saat ini dan pergi ke record berikutnya. Ini berarti bahwa tidak ada aturan lebih lanjut yang dieksekusi untuk catatan saat ini, dan sisa tindakan aturan saat ini tidak dieksekusi.
Sekarang mari kita perhatikan bagian kedua dari skrip /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Di sini jika baris cocok dengan ekspresi reguler /REG.*\(deleted\)$( $berarti yang (deleted)seharusnya menjadi kata terakhir pada baris), itu hanya mencetak >/proc/%s/fd/%d\n", $2,$4.
Dalam perintah lsof $4adalah nomor deskriptor file (misalnya 53w, wcara filer telah dibuka untuk menulis) atau tipe file, tergantung pada file. The %ddalam printfmemastikan bahwa hanya angka-angka akan dicetak, menghapus setiap karakter teks (seperti w). $2mencetak id proses dari proses yang menggunakan file sehingga akan mencetak sesuatu seperti >/proc/3989/fd/53dan seterusnya akan mencetak semua file yang telah dihapus tetapi deskriptor file yang tetap terbuka, dengan kata lain, deskriptor file yang dapat dipotong dengan aman.
Perintah ini akan memotong file yang dihapus dari lsof.
Ini pertama akan daftar file yang terbukalsof
kemudian cari baris secara rekursif satu lalu {next}yang berisi REG '$4~/txt/{next};/REG.*\(deleted\)$/sebagai parameter keempat maka proses ini relatif terhadap baris ini akan dihapus
dan kemudian mencetak semua hasil tanpa garis yang berisi REG dan ditandai sebagai dihapus.{printf ">/proc/%s/fd/%d\n", $2,$4}'
shuntuk pemotongan aktual dan terlebih lagi ada dua ekspresi reguler di sana, tidak satu seperti dalam penjelasan Anda