Temel Linux öğrenme notlarım — 4

Semih Saydam
10 min readSep 12, 2022

--

Merhaba,

Önceki yazımızda en son dizin işlemleri ve komutları kısmında kalmıştık. Şimdi dosya işlemlerini öğrenerek başlayacağız :

touch: Touch komutu bize kolay bir şekilde dosya oluşturmamızı sağlıyor. Örnek olarak touch yeniyazdığınızda bulunduğunuz konuma "yeni” adında bir dosya oluşturur. touch -t 201902231530.55 yeni komuta “-t” parametresi ekleyerek, ls -l ‘de görebileceğiniz oluşturulma tarihini güncelleyebiliriz. 201902231530.55 bu tarih formatı yıl|ay|gün|saat|dakika|.|saniye şeklindedir. Birden fazla dosya oluşturmak için de yine önceden yaptığımız mantık ile boşluk bırakarak komutu uygulayabilirsiniz touch ilkdosya ikincidosya ucuncudosya.

cat : Terminal üzerinden dosyaların içeriğini okumamızı sağlar. cat <dosya_adı> şeklinde kullanılır. Yine aynı şekilde aralarda boşluk bırakarak birden fazla dosyayı okuyabilirsiniz cat <dosya1_adı> <dosya2_adı>. “cat” sadece dosya okuma işlemini değil, yeni dosya oluşturma ve dosyaların içeriğine yeni veriler ekleme gibi işlemler de yapabiliyor. cat > dosya_adı şeklinde yeni dosya oluşturabilir ve bunu yaptığınız anda alt satıra inip sizden dosyanın içeriğini girmenizi bekler :

cat > dosya_adı komutundan sonra, oluşturulacak dosyanın içeriğini giriyoruz ve kaydedip çıkmak için Ctrl + D kısayolunu kullanıyoruz(hatırlarsanız bu terminali kapatma kısayoluydu, işlemi kapatmamızı da sağladı). Ardından cat dosya_adı şeklinde dosyamızın adıyla komutumuzu uygulayıp, dosyanın içeriğini okuyoruz. Burada “>” işaretiyle cat’i kullandığımızda yeni bir dosya oluşturuyor veya dosya varsa içindeki verileri silip yeni veriler yazmanıza imkan sağlıyor. Siz eğer içindeki verileri koruyup, üzerine ekleme yapmak isterseniz cat >> dosya_adı şeklinde “>>” komut yazmamız gerekiyor.

“>” büyüktür işaretinin yaptığı işi iyi anlamışsak, bu mantığı unutmayalım çünkü farklı yerlerde de kullanabiliriz. Örneğin ls -l ile bulunduğumuz konumdaki dosyaların bilgilerini çekip, bunu bir dosyaya yazabiliriz :

Gördüğünüz üzere ls -l > dosya_adı şeklinde ls -l in vereceği çıktıyı direkt olarak dosyaya yazdırdık.

cat komutu ile yine “>” yardımıyla kopyalama da yapabiliriz, cat ls_ciktisi > yeni_dosya komutuyla az önce oluşturduğunuz dosyanın içeriğini “yeni_dosya”ya aktarır. yeni_dosya yoksa oluşturup kopyalar, eğer varsa içindekileri silip ls_ciktisi dosyasındaki verileri yerleştirir. Yine mantığı anlamaktan yola çıkarsanız, verileri koruyup üzerine yeni şeyleri kopyalamak isterseniz “>>”i kullanabiliriz :

tac : “cat” komutunun tersi olarak yazılır. Tersi olarak yazılmasının mantığı da gerçekten cat komutunun çıktısının tersini yazdırmasıdır :

Hazır bir reverse işlemi yapmışken, rev komutundan da bahsedelim. rev komutu dizeleri sondan başa doğru ters çevirerek ekrana basar :

echo : Daha önceden çok kez kullandığımız echokomutunu daha ayrıntılı inceleyelim. echo komutu terminal ekranından istenilen bilgiyi çıktı olarak verir. Bunun yanında bir dosya oluşturup içeriğine de istediğiniz bilgiyi yazmak isterseniz bunu da echoile ve “>” sihriyle yapabiliriz echo "merhaba dünya" > dosya_adi. Tahmin edersiniz ki burada da “>>” sihri ile ekleme de yapabilirsiniz.

echo * komutu ile ls komutunun yaptığı listeleme ve görüntülemeyi de yapabiliriz. Buradaki * tüm dosyaları ifade ettiği için bu kullanımı gerçekleştirebildik :

siz eğer echo d* yaparsanız “d ile başlayıp devam eden her şeyi getirecektir.”(Mantığı için Regex yazımı okuyabilirsiniz).

echo komutunun bir güzel kullanımı da echo `komut` , bu kullanım ile backtick(`)(Ctrl + Alt + ,) içindeki komutun çıktısını yazdırabiliriz, örneğin :

echo `ls` ile ls komutu çalıştırılacak ve çıktısı echo ile yazdırılacaktır. Buna alternatif olarak aynı işi echo $(ls) şeklinde $(komut) de yapabilirsiniz.

more : cat komutu ile aynı vazifeyi görür more <dosya_adi>. Fakat more komutunun bir avantajı tek sayfada gösterilemeyecek olan dosyalar okunurken “Enter” ile satır satır, “Space” ile sayfa sayfa ilerlemenizi sağlar. “B” tuşu ile space tuşuyla atlanılan kısma geri dönebilirsiniz, yani “B” ile sayfa sayfa geri, space ile ileri gidebiliriz. Okuma işlemini bitirmek için q(quit) tuşuna basabiliriz.

less : komutu tıpkı more komutu gibi büyük dosyaları terminal ekranı üzerinde rahatça okuyabilmemizi sağlar less <dosya_adi>.

head / tail : Türkçeleri baş ve kuyruk olan bu komutlar aşağıdaki gibi çalışır :

Gördüğünüz üzere 17 satırlık bir dosyamız var. head <dosya_adi> bunun ilk(baş) 10 satırını, tail <dosya_adi> ise son(kuyruk) 10 satırını getirdi. Burada 10 satır default’tur, eğer farklı sayıda satır isterseniz örneğin 15 head -n 15 <dosya_adi> şeklinde kullanabilirsiniz. Tail komutunu docker, openshift vb. çoğu yerde options olarak da görebilirsiniz, akıp giden canlı logları sondan(kuyruk) takip etmek için kullanılır.

nl : Number lines(numaralandırılmış satırlar) isminden de anlayabileceğimiz gibi, terminalde açtığımız dosyaları numaralı bir şekilde görmemizi sağlar nl <dosya_adı> :

Gördüğünüz gibi satırları bizim için numaralandırdı. Bunu da database işlemlerinde vb. kullanabiliriz değil mi ? :)

sort : Terminalde okumak istediğimiz içeriği alfabetik olarak sıralar :

cat komutu ile dosyanın orijinal halini gördükten sonra, sort <dosya_adi> şeklinde dosya içindekileri alfabetik olarak sıraladığını görüyoruz. Alfabetik sıralamanın tersine sıralamak isterseniz, sort -r <dosya_adi> şeklinde “-r” parametresini kullanabilirsiniz.

paste : Terminal ekranında birden fazla dosyayı aynı anda yan yana açabilmemizi sağlar :

Gördüğünüz gibi “yeni_dosya” ve “yeni2_dosya” içeriklerini birleştirip bize çıktı olarak verdi. Sadece iki dosya değil, arada boşluk bırakarak daha fazla yazabilirsiniz.

cmp : İki dosyayı karşılaştırıp, eğer iki dosya arasında fark varsa ilk hangi satırda meydana geldiğini ve ne kadar byte’lık fark olduğunu bildirir. Farkların hepsini değil, ilk hangi satırda olduysa onu verir. İki dosya aynı ise komut satırına herhangi bir çıktı basmaz.

grep : Görevi filtrelemektir, aradığınız ifadeyi dosyalar/dizinler içerisinde bulmanızı sağlar :

Gördüğünüz gibi dosya içinde “semih” ifadesini grep "semih" <dosya_adi> komutuyla aradık ve 3 tane buldu.

  • Burada tabii büyük-küçük harf duyarlılığı olacaktır, büyük-küçük harf duyarlılığı olmadan bir filtreleme yapmak isterseniz grep -i "semih" <dosya_adi> şeklinde “-i” parametresini kullanabilirsiniz.
  • Eğer bir dosyada değil de, bulunduğunuz dizindeki tüm dosyalarda aramasını isterseniz grep -i "semih" * tahmin edeceğiniz gibi “ * ” ifadesinden yararlanıyoruz. <dosya_adi> : “semih” şeklinde hangi dosyalarda da geçtiğini söyleyerek size çıktı verecektir. Burada eğer grep -i "semih" y* derseniz örnek olarak, “semih” ifadesini sadece y ile başlayan(y*) dosyalarda arayacaktır.
  • Burada yazdığımız komutlar dosyalar içinde arama yaptığı için, dizinler için çıktı vermeyip grep: Music: Bir dizin uyarılar mesajları gösterecektir. Eğer siz dosya/dizin gözetmeksizin her şeyi dahil et ve “semih”i ara diyorsanız grep -ir "semih" * komutuyla yani “-r” parametresini de ekleyerek bunu yapabilirsiniz.
  • Eğer siz filtrelediğiniz “semih” ifadesinden sonraki satırları da merak ediyorsanız bunu “-A” parametresiyle yapabilirsiniz grep -A 2 "semih" <dosya_adi> örneğin bu komutta “semih” ifadelerini yakalayıp, ondan sonra gelen 2 satırı daha getirecektir(önceki satırları isterseniz “-B” parametresi, hem sonraki hem öncekinden getirsin isterseniz “-C” parametresi) :
  • Pipe ile iki işlemi birbirine bağlayıp, grep’i kullanmaya çalışalım. Örneğin ls komutu ile gelen çıktıları filtrelemek istersek ls | grep "arama filtresi" ile gelen çıktılardan “M” harfi içerenleri almış oluyoruz. Burada ls ve grep işlemlerini pipe ile birbirine bağladık, ls çıktısını grep ‘e girdi olarak verdik :

find : locate komutu gibi aradığımız dosya veya dizinleri bulmamızda bize yardımcı olur. Örneğin find -name komut.sh yazdığımızda, bize komut.sh dosyamızın konumu verecektir :

Fakat bu arama işlemini bulunduğunuz dizinde yapar. Eğer siz bulunduğunuz dizinde değil de farklı bir dizinde arama yapmak isterseniz örneğin find /etc -name local* şeklinde bir komutla “/etc” dizini içerisinde yer alana “local” ifadesiyle başlayan tüm dosya ve dizinleri bize getirecektir. Burada tip belirterek de arama yapabilirsiniz örneğin find -name linux -type f şeklinde, “-type f” ifadesi görünümü dosya olanları bize getirecektir. Burada dosyalar yerine dizin’ler için yapmak isterseniz “-type d” şeklinde verebiliriz.

Örnek bir senaryo olarak, diyelim ki dosya içerisindeki 200 kb’tan fazla olan dosyaları tespit etmeniz gerekiyor. Bu durumda find -size +200k şeklinde bir komut girebiliriz. Tahmin edersiniz ki 100kb’dan küçükleri bana getir demek için de find -size -100k verebiliriz.

Find komutu ile yetkilendirmeye göre de arama yapabiliyoruz. Örneğin 700 yetkisine sahip dosyaları bulmak için find -perm 700 yazabiliriz. Buradaki perm, permission’un kısaltmasıdır. Yetkilendirmeyi ayrıntılı bir şekilde ilerde inceleyeceğiz.

Dosyaları değiştirme tarihine göre de arayabiliriz. find -ctime 5 yaparsak 5 gün önce değiştirilmiş dosyaları bulabiliriz. “ctime”, change time’ın kısaltmasıdır. Eğer siz tam 5 gün önce değiştirilmişleri değil de, 5 gün içerisinde(1 gün, 2 gün, 3..5) değiştirilmişleri bulmak isterseniz find -ctime -5 komutunu girebilirsiniz. “-5” 5 günden kısa sürede değiştirilmişleri ifade eder, “+5” derseniz de 5 günden uzun sürede değiştirilmiş mesela 40 gün önce değiştirilmiş.

xargs: Kendisinden önce verilen girdi verilerini, kendisinden sonraki komuta argüman olarak aktarma işini yapar. Bir senaryo oluşturacak olursak; Öncelikle find -name *.jpeg komutu ile farklı farklı konumlarda duran jpeg dosyalarını buluyoruz. Ardından find -name *.jpeg | xargs rm pipe karakteri ile find komutundan topladığımız, jpeg dosyalarını, sonraki komut olan xargs rm ‘e aktarıyoruz. Burada xargs komutumuz elde edilen verileri(jpeg dosyaları), rm komutuna tek tek aktardı ve komutun tekrar tekrar her bir jpeg için çalışmasını sağladı. Daha iyi anlamak için, rm komutunu bir fonksiyon gibi düşünürseniz, xargs bir listeyi tek tek o fonksiyona parametre olarak yollayıp çalıştırıyor diyebiliriz. Bunu ismindeki args’tan da hatırlayabilirsiniz.

xargs Aralarında boşluk bulunan her veriyi tek tek ele alarak argüman olarak ilgili komuta ulaştırır. Başka bir örnek olarak echo "bir iki uc" | xargs mkdir komutu 3 tane dosya oluşturacaktır. xargs sayesinde hepsi mkdir’e argüman olarak gider. Eğer xargs kullanmazsanız bunun komutun çalışmayacağını görebilirsiniz(echo “bir iki uc | mkdir).

cp : Dosyaları kopyalama işlevindedir. cp yeni2_dosya dosya/dosya2 komutu ile bulunduğumuz Masaüstü konumunda bulunan ‘yeni2_dosya’sını başka konumda bir yere(dosya/dosya2) kopyalıyoruz :

Eğer siz başka bir konumdaki dosyayı, olduğunuz yere kopyalamak isterseniz bu sefer cp dosya/dosya2/discipline . ifadesini kullanıyoruz :

Burada biz /Masaüstü konumunda olduğumuz için ve halihazırda oraya dosyayı kopyalamak istediğimiz için, bulunduğumuz konumu temsil eden “ . ”yı kullanıyoruz. Yukarıda da görebildiğiniz gibi “.” bizi bulunduğumuz konum /root/Masaüstü’yü yazmaktan kurtarıyor(pwd [print working directory] ile bulunduğumuz konumu bulabildiğimizi anımsadınız değil mi? 🙂). Buradan hareketle, yine mantığımızı kullanarak bir üst dizine dosyayı kopyalamak istersek cp <dosya_path'i> .. şeklinde “..”yı kullanabiliriz. Ve yine aynı mantıkla “root” dizinine bir şey kopyalamak istersen cp <dosya_path'i> / yapabiliriz, “/” root dizini temsil ediyordu hatırlarsanız. cp komutu default olarak, kopyalanan dizinde o dosya varsa bile onu ezer, bunu engelleyip size sorularak ezme işlemi yapmak için “-i” parametresini kullanabilirsiniz cp -i <dosya_path'i> <kopyalanacak path>.

mv: Dosya taşıma işlevini görür. Önceki cp komutumuz kopyala-yapıştır işlemini yapıyorken, bu kes-yapıştır işlemini yapıyor gibi düşünebiliriz :

Gördüğünüz üzere mv <dosya> <taşınacak_path> komutu ile dosyayı taşıdık. Tabii yine cp komutundaki gibi çift yönlü bu işlemi yapabiliriz. Yani dosyayı illaki olduğumuz path’ten başka yere taşımamız gerekmiyor. Örneğin :

mv dosya/dosya2/discipline . komutu ile az önce dosya2 içine gönderdiğimiz dosyayı, geri o dosyanın içinden “.(yani masaüstü)”ne geri aldık. Yani genel kullanımı mv <dosya_path'i> <taşınacak path> şeklinde.

rm : Dosya silme işlevini görür, eğer dizin silmek isterseniz hatırlarsanız “-r” parametresi eklemiştik. rm <dosya_adi> şeklinde dosyayı silebilir, eğer birden fazla dosyayı ayna anda silecekseniz rm <dosya_adi> <dosya_adi> şeklinde arada boşluklar bırakarak verebilirsiniz.

shred : Dosyaları daha güvenli şekilde silmeye yarar. Dosyanın içine rastgele bit’ler yazıp, dosyanın okunmaz hale gelmesini sağlıyor. Önemli belgelerinizi direkt çöp kutusuna atmayıp, kalemle üzerini karalayıp atmanıza benzetebilirsiniz shred <dosya_adi> :

Defaultta dosyaya 3 defa bit yazar, eğer daha fazla karmaşıklık isterseniz bunu artırabilirsiniz shrd -n 5 <dosya_adi>. “v” parametresiyle(verbose[ayrıntılı]) yapılan işlemi takip etmemizi ve “u” parametresiyle de rastgele bitler yerleştirildikten sonra silinmeyi sağlıyoruz shred -n 5 -vu <dosya_adi>.

Burada biraz soluklanalım 🥱, sonraki yazıda görüşmek üzere :)

Kaynakça :

  • https://www.udemy.com/course/kali-linux-ile-sifirdan-temel-linux-egitimi/

--

--