Bir satıra birden fazla komutun nasıl yerleştirileceğini öğrenmeye çalışan benim gibi yeni başlayanlar için genişletilmiş açıklamalı basitleştirilmiş bir versiyon.
Sorunu adım adım yazacak olsaydın, şöyle görünürdü:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Bunu başarmak için, biz üç UNIX komutları kullanabilirsiniz: find
, file
, ve grep
.
find
dizindeki her dosyayı kontrol edecek.
file
bize dosya türünü verecek. Bizim durumumuzda, 'ASCII metni' dönüşü arıyoruz
grep
çıkışta 'ASCII' anahtar kelimesini arayacaktır. file
Peki bunları tek bir satırda nasıl dizebiliriz? Bunu yapmanın birden fazla yolu var, ancak bunu sahte kodumuza göre yapmanın en mantıklı olduğunu görüyorum (özellikle benim gibi yeni başlayanlar için).
find ./ -exec file {} ";" | grep 'ASCII'
Karmaşık görünüyor, ancak çözdüğümüzde fena değil:
find ./
= bu dizindeki her dosyaya bak. find
'İfadesini' kibrit veya ne olursa olsun herhangi bir dosyanın dosya adı dışarı komut baskılar bizim durumumuzda geçerli dizin veya yolu, sonra gelir./
Anlaşılması gereken en önemli şey, ilk bitten sonraki her şeyin Doğru veya Yanlış olarak değerlendirileceğidir. True ise, dosya adı yazdırılacaktır. Değilse, komut devam eder.
-exec
= bu bayrak, arama ifadesi olarak başka bir komutun sonucunu kullanmamıza izin veren, bul komutu içindeki bir seçenektir. Bu, bir işlev içindeki bir işlevi çağırmak gibidir.
file {}
= içinde çağrılan komut find
. file
Komut size bir dosyanın filetype anlatan bir dize döndürür. Düzenli, bu gibi görünecektir: file mytextfile.txt
. Bizim durumumuzda, find
komut tarafından bakılan dosyayı kullanmasını istiyoruz , bu yüzden {}
boş bir değişken veya parametre olarak davranması için küme parantezleri koyuyoruz . Başka bir deyişle, sistemden dizindeki her dosya için bir dize çıkarmasını istiyoruz.
";"
= bu gerekli find
ve -exec
komutumuzun sonundaki noktalama işaretidir . Çalıştırarak ihtiyacınız varsa daha fazla açıklama için 'bul' kılavuzuna bakın man find
.
| grep 'ASCII'
= |
bir borudur. Boru solda olanın çıktısını alır ve sağdakine girdi olarak kullanır. find
Komutun (tek bir dosyanın dosya türü olan bir dize) çıktısını alır ve dizeyi içerip içermediğini test eder 'ASCII'
. Varsa, true döner.
ŞİMDİ, sağındaki ifade find ./
, grep
komut true döndürdüğünde true döndürür. Voila.
find . -type f -exec grep -Il "" {} \;
.