Saya membaca beberapa artikel dan saya telah melihat perintah ini:
lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Bisakah seseorang membantu saya untuk memahaminya
command-line
Braiam
sumber
sumber
Jawaban:
Perintah ini akan mencetak file dari
lsof
yang 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
txt
maka baris teks berikutnya akan dibaca, yang skrip akan mulai memproses dari awal lagi.The
next
pasukan 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
$4
adalah nomor deskriptor file (misalnya53w
,w
cara filer telah dibuka untuk menulis) atau tipe file, tergantung pada file. The%d
dalamprintf
memastikan bahwa hanya angka-angka akan dicetak, menghapus setiap karakter teks (sepertiw
).$2
mencetak id proses dari proses yang menggunakan file sehingga akan mencetak sesuatu seperti>/proc/3989/fd/53
dan seterusnya akan mencetak semua file yang telah dihapus tetapi deskriptor file yang tetap terbuka, dengan kata lain, deskriptor file yang dapat dipotong dengan aman.sumber
Perintah ini akan memotong file yang dihapus dari lsof.
Ini pertama akan daftar file yang terbuka
lsof
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 dihapusdan kemudian mencetak semua hasil tanpa garis yang berisi REG dan ditandai sebagai dihapus.
{printf ">/proc/%s/fd/%d\n", $2,$4}'
sumber
sh
untuk pemotongan aktual dan terlebih lagi ada dua ekspresi reguler di sana, tidak satu seperti dalam penjelasan Anda