Yanıtlar:
Bu komut, kesilmesi gereken dosyaları yazdırır lsof.
(Aslında herhangi bir dosyayı kaldırmaz veya kesmez ).
lsof aşağıdaki gibi işleyen awk'ye aktarılan açık dosyaların (dosya tanımlayıcıları) bir listesini döndürür.
gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Yukarıdaki ifade, noktalı virgülle ayrılmış iki normal ifade içerir ;
ilk kısmı düşünelim gawk '$4~/txt/{next};
Burada, 4. alan içeriyorsa txt, komut dosyasının en baştan yeniden işlemeye başlayacağı bir sonraki metin satırı okunacaktır.
nextDeyim kuvvetleri derhal işlemi o anki kayıtta durdurmak ve bir sonraki kayda gitmek için awk. Bu, geçerli kayıt için başka kural yürütülmediği ve geçerli kuralın eyleminin geri kalanının yürütülmediği anlamına gelir.
Şimdi betiğin ikinci bölümünü ele alalım /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Burada satır normal ifadeyle eşleşiyorsa /REG.*\(deleted\)$( satırdaki son sözcük olması gereken $araç (deleted)), yalnızca yazdırılır >/proc/%s/fd/%d\n", $2,$4.
Lsof komutunda $4dosya tanımlayıcı numarası (örneğin 53w, disk denetleme dosyasının wyazmak için açıldığı anlamına gelir) veya dosyaya göre dosya türü bulunur. %dİçinde printfsadece sayılar (gibi herhangi bir metin karakterleri kaldırarak, baskılı olmasını sağlar w). $2dosyayı kullanan işlemin işlem kimliğini yazdırır, böylece böyle bir şey yazdırır >/proc/3989/fd/53ve böylece silinmiş ancak dosya tanımlayıcısı açık kalan tüm dosyaları, yani güvenli bir şekilde kesilebilen dosya tanımlayıcılarını yazdırır.
Bu komut, silinen dosyaları lsof'tan keser.
Bu ilk önce açık dosyaları listelerlsof
daha sonra dördüncü parametre olarak {next}REG içeren satırları özyinelemeli olarak arayın, ardından '$4~/txt/{next};/REG.*\(deleted\)$/bu satıra göre bu işlem silinir
ve ardından REG içeren satırlar silinmemiş olarak işaretlenmiş tüm sonuçları yazdırın.{printf ">/proc/%s/fd/%d\n", $2,$4}'
shfiili budamaya ve Morever iki düzenli ifadeler orada açıklama gibi bir tane değil