Dosya İşlemleri
Konumuz itibari ile dosyalarla epeyce haşır neşir olacağız. Yapacağımız işlemleri kısaca tanımlamak gerekirse; dosya kopyalama, taşıma, değiştirme, görüntüleme, düzenleme gibi işlemelerle dosyalar üzerinde hakimiyet kuracağız.
touch
touch
komutu bize kolaylıkla metin dosyası oluşturma imkanı tanıyor. İşte bu yüzden dosya işlemleri konumuza touch
komutu ile başlamak gayet doğru bir karar olacaktır.
Kendimize touch
komutunu kullanarak boş bir dosya oluşturmak için komut satırına touch dosya_ismi
şeklinde yazmamız gerekiyor. Burada fark ettiyseniz herhangi bir uzantı girmeme gerek kalmadı. Çünkü Linux sisteminde uzantı belirtme zorunluluğu bulunmuyor. Bu durumu gözlemlemek için konsola touch yeni
komutunu vererek "yeni" adından bir dosya oluşturalım.
Görüldüğü üzere dosyamız bulunduğumuz ana dizinde oluşmuş oldu. Bunu teyit etmek için de çıktıda görüldüğü gibi daha önce öğrenmiş olduğumuz listeleme görevinde olan ls
komutunu kullandık.
Peki bir tane değil de birden fazla dosya oluşturmak istersek ? İşte bunun için de komutumuzu touch yeni1 yeni2 yeni3
şeklinde yazmamız yeterli.
Çıktıda görüldüğü gibi aynı andan 3 dosya oluşturmayı başardık.
Aslında touch
komutunun çok farklı kullanım yöntemleri de mevcut ancak ben son olarak dosyaların tarih etiketlerini nasıl değiştirebiliriz bunu göstermek istiyorum.
Dosyamızın tarih etiketini düzenlemek için touch komutunun t
parametresini kullanacağız. Kullanımı ise touch -t YYYYAAGGSSDD.SS dosya_adı
şeklindedir.
Öncelikle dosyamızın mevcut tarih etiketine bakalım.
Şimdi dosyamızın tarih etiketini daha önceki bir tarihe çevirelim. Ben burada örnek olması açısından tarih olarak 2015.01.01 ve saat 22:15:32 zamanlamasını kullanıyorum. Nasıl kullanıldığını daha net anlamak için örneği inceleyebilirsiniz.
Gördüğünüz gibi dosyamın tarih etiketi değişmiş oldu. Bu değişme işlemini ileri veya geri tüm tarihler için kullanabilirsiniz.
cat
cat
komutu temelde dosya içeriğini terminal ekranından okumamıza olanak sağlayan komuttur. Ancak bu komut bizlere temel işlevinin dışında da dosyalar ile ilgili pek çok işlem yapma imkanı sağlıyor. Sırasıyla bunların bazılarına göz atacağız. Ama ilk olarak temel işlevi olan terminal üzerinden dosya okuma işlevini görelim.
Bunun için konsola açmak istediğimiz dosyanın konumundayken cat açılacak_dosya
şeklinde komut vermemiz gerek.
Ben masaüstü konumunda yer alan "test.txt" isimli dosyanın içeriğini okumak üzere konsola cat test.txt
komutunu veriyorum.(Dosyayı grafik arayüzü aracılığı ile de açarak durumu kıyaslamanızı istedim.)
Şimdi ise tıpkı touch
komutunda çoklu dosyalar ile ilgili işlem yaptığımız gibi cat
komutu ile de çoklu dosya okuma işlemini gerçekleştirelim. Çoklu dosya okuma işlemi için komut satırına cat dosya1 dosya2 dosya3
şeklinde okumak istediğimiz dosyaların adlarını yazıyoruz.
Dosya içeriğine yazı eklemek istersek cat > dosya_adı
şeklinde komut verdiğimizde, komut satırı imleci bir alt satıra geçerek bizden yazmak istediğimiz bilgiyi bekler. Yazma işlemimiz bittikten sonra kaydederek kapatmak için Ctrl + D tuş kombinasyonunu kullanırız. Ayrıca komutta girdiğimiz isimde bir dosya yoksa o isimde bir dosya oluşur ve girilen veriler içerisine işlenir.
Ancak var olan bir dosyanın adıyla bu komutu kullandıysanız ve dosya içerisinde yazı bulunuyorsa bu işlemin ardından dosyada bulunan eski veriler silinerek yalnızca girilen yeni veriler dosyaya işlenip kayıt oluyor.
Bizler eğer önceki veriler silinmesin ve üzerine yeni veri ekleyebilelim istersek, komutumuzu cat >> yeni3.txt
şeklinde kullanarak; yeni gireceğimiz verileri girdikten sonra Ctrl + D tuş kombinasyonu ile dosyamızı yeni eklenmiş verileriyle birlikte kaydedip kapatabiliriz.
Gördüğünüz gibi yeni eklediğimiz veri dosyamızın içine işlenmiş oldu üstelik eski veriler de yok olmadan.
Ayrıca yeri gelmişken kullanmış olduğumuz > yönlendirme operatörü ile ilgili bir örnek daha yapalım ki kullanım alanının biraz daha farkına varmış olalım. Örneğin ls -ls
çıktısının içeriğini "liste" adında bir dosya oluşturarak içerisine aktaralım. Bunun için ls -ls > liste
komutunu kullanabiliriz. Şayet yeni dosya oluşturmak istemiyorsak ve gireceğimiz veriler var olan dosyaya yazılsın istiyorsak o zaman > operatörü yerine >> operatörünü kullanırsak yeni veriler dosyaya eklenmiş olur.
Komutta açıklanacak bir durum yok zaten hepsi bildiğimiz komutlar. Burada asıl önemli olan > operatörünün kullanımıydı. Eğer anladıysak ne âlâ.. devam edelim.
cat
komutunun işlevlerine devam ediyoruz; şimdi ise sırada, bir dosyada yer alan verileri başka bir dosyaya kopyalamak var. Bunun için komutumuzu cat veri_alınan_dosya > veri_alan_dosya
şeklinde kullanıyoruz.
Komutumuzun kullanım şekilleri elbette bunlar ile sınırlı değil. Belki defalarca söyledim ancak bu komut için de söylemem gerek; daha fazla detay için lütfen man kılavuz sayfasına göz atın.
tac
İsminden de anlamış olacaksınız ki tac
komutu önce gördüğümüz cat
komutunun tersi şekilde çıktı veriyor. Bu durumu daha iyi anlamak için karşılaştırmalı olarak verilen çıktıyı inceleyiniz.
rev
Hazır terslikten bahsetmişken rev
komutundan da söz etmemek olmaz. Bu komut dizeleri sondan başa doğru çevirerek ters şekilde ekrana basıyor. Bu durum en iyi örnek ile açıklanır. Hatta cat
komutu ile de karşılaştırırsak sonuç daha net oraya çıkacaktır.
Çıktılarda görüldüğü gibi dosya içeriğinde yer alan ifadeler rev
komutu sayesinde ters şekilde ekrana basılmış oldu.
"Şimdi ben bu komutu nerede kullanacağım? neden öğrendim?" demeyin. Bu konuya daha önce de değinmiştim, şimdi tekrar söylüyorum; burada öğrendiğimiz her komutu her zaman doğrudan kullanmayabilirsiniz, ancak yeri geldiğinde böyle bir komutun varlığından haberdar olarak gerektiğinde dokümantasyona bakmak suretiyle komutun kullanımına en kısa sürede ulaşabilirsiniz. Yani artık bu komutun varlığından haberdarsınız, eğer hatırlamak için bakmanız gerekirse burada olacak..
echo
Bu komutumuzu daha önce defaatle kullanmak durumunda kalmıştık hatırlarsanız. Kullandıkça da işlevinden bahsetmiştik ancak şimdi komutumuzu ele alarak biraz daha yakından bakmaya başlıyoruz.
Temel işlevi terminal ekranına istenilen bilgileri çıktı olarak göndermektir. Komutumuzu kullanırsak daha net anlaşılacaktır. Örneğin komut satırına "Merhabalar" yazdırmak isteyelim, bunun için komut satırına echo Merhabalar
şeklinde komutumuzu girmemiz yeterli.
"Merhabalar" çıktımızı almış olduk. echo
komutu sadece ekrana basma işlevine sahip değil. Örneğin bir dosya oluşturup içerisine istediğimiz ifadeyi yazabiliriz. Bunun için komut satırına echo "yazılacak_ifade"> dosya_adı
şeklinde komutu giriyoruz.
Sırasıyla yaptığım işlemleri açıklayayım.
İlk önce cd Desktop
komutu ile masaüstü konumuna geldim.
Daha sonra echo "Deneme Metni" > deneme
komutunu vererek masaüstü konumuna deneme isimli bir dosya oluşturarak içerisine "Deneme Metni" ifadesini yazmış oldum.
ls
komutu ile de bulunduğum konumdaki dosyaları listeleyerek içerisinde oluşturduğum "deneme" adlı dosyanın bulunup bulunmadığını teyit ettim.
cat deneme
ile de cat
komutunun en temel kullanım işlevi olan içeriği ekran basma işlevini kullanarak oluşturduğum dosyanın içeriğine baktım.
Sonuç itibari ile her şey sorunsuz ilerledi ve finalde yeni oluşturmuş olduğum deneme isimli dosyanın içerisine "Deneme Metni" ifadesini yazdırmış oldum.
Ancak şöyle bir hatırlatmada bulunayım; eğer var olan bir dosyanın içeriğine yeni içerikler eklemek isterseniz daha önce de kullandığımız şekilde >> parametresini kullanın. Aksi halde dosya içeriğindeki her şey silinir ve yalnızca sizin son yazdığınız ifade kalır.
Var olan dosya içeriğine yeni bir ifade eklemek için komutu echo "Yeni ifade" >> dosya_adı
şeklinde girmemiz gerek.
Şimdi echo
komutunun ls
komutu görevi gördüğü bir kullanıma değineceğiz.
Örneğin bulunduğumuz dizinde yer alan dosyaları görmek istersek komut satırına echo *
şeklinde yazmamız halinde çıktı bizlere bulunduğumuz konumda yer alan dosyaları verir. Bu komut kullanımını ls
komutu ile karşılaştırdığımızda daha net anlaşılacaktır.
* (yıldız işareti) joker karakteridir ve herhangi dosya dizin isimlerinin yerini tutar. Yani echo
komutuna * karakteri eklediğimizde mevcut dizinde yer alan tüm dosya dizinler * parametresi ile kapsanacağı için ne var ne yok listeleniyor. Bu duruma örnek olması açısından bulunduğumuz dizinde yer alan dosyalarda örneğin "list" adı ile başlayanları çıktı olarak almak istersek komut satırına echo liste*
şeklinde komut vermemiz yeterlidir. (İleride ele alacağımız Joker karakter/wildcard konusundan bu karakterler açıklanmıştır.)
Son olarak echo
komutunun kullanım şekillerinden olan, bir komutun çıktılarının echo
komutu ile ekrana basılması var. Ancak doğrudan echo komut
şeklinde yazılan komutlar istenmeyen bir sonuç çıkaracaktır. Verdiğimiz komutun çıktılarını alma işlemini gerçekleştirebilmek için echo
komutunun bu iş için kullanım özelliklerinden olan iki farklı seçenek bulunuyor. Bunlardan biri ters tırnak ' işaretini diğeri ise $(komut)
parametre bütünüdür. Bunları sırayla görelim.
İlk olarak ters tırnak işaretli olan kullanımı ele alalım.
Ters tırnak işaretini oluşturmak için Türkçe klavyede AltGr + , (AltGr ile birlikte virgül tuşuna basmak gerek)tuş kombinasyonunu kullanabiliriz. Komutun kullanımını için ise istediğimiz komutu tırnak içerisinde echo
komutunun yanında kullanmak üzere echo 'komut'
şeklinde yazıyoruz.
Hemen bu kullanım ile ilgili bir örnek yapalım ve ls
komutunun çıktılarını echo
komutu yardımı ile basalım.
Ve ikinci yol olan $(komut)
parametre bütünü; yine ls
komutu için örneklendirilecek olursa, kullanımı echo $(ls)
şeklinde komut parantez içine gelecek şekilde olmalıdır.
Sonuç itibari ile ilk echo ls
komutunun çıktısı olan "ls" ifadesi bizim almak istediğimiz çıktıyı bizlere vermedi. Yani bu kullanım bizim yapmak istediğimiz iş olan, komutun çıktılarının ekrana bastırılması için doğru bir kullanım değildi. Doğru kullanım şekli ise ikinci ve üçüncü komut olan echo 'ls'
, echo $(ls)
şeklindedir. Bu komutların çıktısı istediğimiz şekilde, yani ls
komutunun çıktısını(bulunduğumuz dizinde yer alan dosyaların bilgisi) ekrana basacak şekilde bizlere verdi. Sözü edilen durumu aşağıdaki çıktıyı inceleyerek bir bütün halinde kavrayabilirsiniz.
more
Şimdiye kadar öyle ya da böyle terminal üzerinden dosya okuma işlemi yapmamıza yardımcı olan komutlar gördük. Bu komutumuz da aynı şekilde metin dosyalarını terminal üzerinden okumamıza olanak sağlayan bir komuttur.
Örneğin daha önce de içeriğini okuyup değişiklik yapmış olduğumuz dosya olan profile dosyasının içeriğini more
komutu yardımı ile okuyalım.
Bunun için /etc/profile konumunda bulunan dosyamı more
komutu ile açmak üzere konsola more /etc/profile
şeklinde konsola yazarak profile dosya içeriğini okumaya teşebbüs ediyorum.
Komutumuzun ardından terminal ekranında karşımıza profile dosyasının içeriği aşağıdaki gibi geldi.
Çıktıda görüldüğü gibi dosyanın içeriği ancak terminal ekranına sığacak şekilde görüntüleniyor. Hatta alt kısımda --More--(77%) şeklinde yazan yazı bizlere içeriğin devamı olduğunu belirtiyor. Eğer devamını okumak istersek enter tuşuna basarak adım adım alt satırlara bakabiliriz. Ayrıca space tuşu ile de sayfa sayfa atlayarak içeriğe göz atabiliriz. Eğer atladığınız sayfadan bir önceki sayfaya geri dönmek istersek b(back/geri) tuşunu, şayet dosya içeriğini görüntüleyen bu ekranı kapatmak istersek ise q(quit/çıkış) tuşunu kullanmamız yeterli.
less
Bu komutumuz da üst kısımda açıkladığımız more
komutu ile aynı işlevdedir. Ayrıntısını merak ederseniz man sayfasına göz atmanız yeterli olacaktır.
Ben yine de less
komutu ile profile dosyasının içeriğinin okunduğu şeklini aşağıya bırakıyorum. Eğer more
komutunda bir problem yaşamadıysanız bu komut kullanımında da kesinlikle yaşamazsınız.
head-tail
Aslında komutların isimleri yani head(kafa/baş) ve tail(kuyruk) bizlere komut hakkında az çok bilgi veriyor. Şöyle ki bir dosyanın sadece baş kısmında ilk 10 satırı görüntülemek istersek head
şayet son 10 satırı görüntülemek istersek ise tail
komutunu kullanırız. Ayrıca bu komutlar özel parametre alarak istenildiği sayıda baştan veya sondan olmak üzere istenilen satırların görüntülenmesine olanak sağlar. Daha iyi anlamak adına hemen kullanımlarına geçelim.
Dosya içeriğinin ilk 10 satırını görüntülemek için head dosya_adı
şeklinde komutumuzu kullanıyoruz.
Şimdi burada 10 satır içerik yok gibi gelebilir ancak dosya içerisindeki boş satırlar da bu 10 satıra dahil olduğundan çıktıyı boş satırlar ile saydığınızda tam olarak 10 satırın görüntülendiğini göreceksiniz.
Dosya içeriğinin son 10 satırını görüntülemek için tail dosya_adı
şeklinde komutumuzu kullanıyoruz.
Şimdi istediğimiz sayıda baştan veya sondan dizinleri görüntüleyelim. Ben örnek olması açısından baştan 6 sondan 2 satırı görüntülemek üzere komutumu veriyorum. Komutun kullanımı
head -n 6
ve tail -n 2
şeklinde.
Baştan 6 satırın çıktıları.
Sondan 2 satırın çıktıları.
nl
Bu komutun işlevi satırları numaralandırarak çıktı vermektir. Hemen görelim.
Çıktıda da görüldüğü üzere dosya içeriğinde yer alan ifadeler satır satır numaralandırılarak ekrana basılmış oldu.
Ayrıca eğer listelenen içerik uzunsa bir önceki öğrendiğimiz head-tail
komutları yardımı ile bu alanı düzenli şekilde sınırlandırabiliriz.
sort
Dosya çıktılarının alfabetik olarak düzenlenmesini sağlar. Örnek üzerinden devam edelim. Ben isimler.txt adında bir dosya oluşturdum ve içerisine karışık olarak isimler ekledim.
Ve bu isimleri alfabetik sıraya dizmek için sort isimler.txt
komutunu kullandım.
Eğer ters alfabetik şekilde yani z den a ya doğru sıralamak istersek -r
parametresi kullanılır.
paste
Örneğin iki dosyanın içeriğini aynı anda yan yana olacak şekilde komut satırında listelemek istersek, bu işi yapmamızı paste
komutu sağlıyor. Kullanımı paste dosya1 dosya2
şeklindedir.
Ben yaşlar.txt ve isimler.txt adlı dosyaları aynı anda yana yana görüntülemek adına komut satırına paste isimler.txt yaşlar.txt
komutunu verdim.
tee
Yazmak istediğimiz ifadeleri hem komut satırına yansıtıp hem de bu ifadelerim bir dosya içerisine kayıt olmasını isterseniz kullanacağınız komut tee
komutu olacaktır.
Örnek üzerinden devam edelim.
tee metin
komutu ile "metin" isminde bir dosya açıyorum ve içerisine birtakım ifadeler ekliyorum daha sonra ekleme işlemim bittiğinde dosyayı kaydederek kapatmak üzere Ctrl + D tuş kombinasyonunu uyguluyorum. En son oluşturmuş olduğum dosya içeriğine bakmak üzere cat
komutunu kullanıyorum.
Çıktıda da görüldüğü üzere terminal ekranında yazdığımız her bir satır tekrar ederek konsola basıldı ve sonuçta oluşturmuş olduğumuz "metin" isimli dosyanın içeriği de yazmış olduğumuz ifadeler ile dolmuş oldu.
cmp
Bu komut sayesinde dosyalar arasından karşılaştırma yapmamız mümkün.
Örneğin ben isimler.txt dosyasını kopyaladım ve 5. satırındaki ismi değiştirdim. Ve bu iki dosyayı cmp
komutu ile kıyasladım.
İki dosyanın da içeriğini cat
komutu ile yazdırdık görüldüğü üzere iki dosya arasındaki fark, bir dosyada mehmet ismi yerine enes isminin yer almasıdır. cmp
komutunun çıktısında da bu durum farklı olan satır ve bayt bilgisi verilerek ifade edeliyor.
grep
Bu komut en çok kullanılan terminal komutları içerisinde bulunuyor. Bu komutumuzu bizler de oldukça sık kullanıyor olacağız. Dosya ya da komut çıktısında bir ifade aramak için yani bir nevi filtreleme işlemi için grep
komutunu kullanabiliriz. Komutun kullanım şekillerini örnekler ile açıklamaya devam edelim.
Eğer bir dosya içerisindeki herhangi bir kelimeyi sorgulamak istersek komutumuzu grep "aranacak_ifade" dosya_adı
şeklinde komut satırına giriyoruz. Ben basit bir örnek olması açısından isimler.txt dosyası içerisinde "hasan" ismi var mı diye kontrol etmek üzere konsola grep "hasan" isimler.txt
komutunu veriyorum.
Arama işleminde, Linux sistemi gereği büyük küçük harf duyarlılığına sahip olduğundan(Hatırlarsanız daha önce bu durumu test etmiştik.) "hasan" şeklinde arama yaptığımızda diğer büyük küçük haldeki anahtar kelimeler çıktıda basılmayacaktır. Eğer bu küçük büyük harf duyarlılığı dışında arama yapmak istersek -i
parametresini kullanabiliriz. Bu durumu gözlemlemek için büyük küçük harflerden oluşan kelimelerin olduğu bir dosya üzerinde grep
komutunu kullanalım.
Eğer arama işlemini tek dosya yerine bulunduğumuz dizin içerisindeki tüm dosyaları kapsayacak şekilde gerçekleştirmek istersek wildcard yani genel kapsama işlevinde olan joker *
karakteri yardımıyla bu işlemi gerçekleştirebiliriz.
Hemen örneklere geçelim. hasan ismini masaüstü konumundayken aratıyorum. Bunun için grep "hasan" *
komutunu konsola verdim.
Gördüğünüz gibi çıktı bize içerisinde "hasan" ifadesi geçen tüm dosyaları verdi.
Çıktıda aradığımız ifadenin hangi dosyada yer aldığını bulmuş olduk. Ayrıca yukarıdaki komutu grep -r "hasan" *
şeklinde de yazabilirdik. Genellikle de bu 2. komut kullanılıyor ancak hangi şekilde kullanacağınızı seçmek size kalmış dilediğiniz kullanabilirsiniz.
İkinci kullanım şeklinde ilkinden farklı olarak "grep: yeni_dizin: Bir dizin" gibi bir çıktı almadık.
Wildcardlardan söz etmişken dosya içerisinde arama işleminin başka bir kullanım şekline de değinelim isterim. Eğer aranacak kelime belirli bir isim ile başlayan dosyalar içerisinde aranacaksa bunu wildcard(joker) yardımıyla özellikle belirtebiliriz.
Kullanımı grep "aranacak_ifade" dosya_adı_başlangıcı*
şeklindedir. Ben ilk önce masaüstünde yer alan dosyaları listeledim daha sonra "hasan" ifadesini aramaya koyuldum. İlk önce "metin" ismi ile başlayan belgelerde grep "hasan" metin*
komutunu kullanarak aradım.
Ancak çıktıda da görüleceği gibi "hasan" ifadesi "metin" ismi ile başlayan belgeler içerisinde yer almıyormuş ki komut çıktısı bize hiç bir sonuç vermedi.
Bende "hasan" ismini bu sefer "isimler" adıyla başlayan belgeler içerisinde aramak için grep "hasan" isimler*
komutunu kullandım. Bunun neticesinde komut satırı bize "hasan" isminin geçtiği belgelerin yerini vermiş oldu.
Buradaki asıl kullanım amacı; komutu, belirli isimlere sahip olan dosyalar içerisinden anahtar kelimeyi aramak üzerine sınırlandırmak.
Bunların dışında arama sonucunun görüntülenmesini de sınırlandırabiliriz; Örnek olması açısından "filozof" isimli dosyadan "jo" ile başlayan isimleri listeliyorum.
Arama sonucu sonrasında kaç satır gözükeceğini -A
parametresi sayesinde grep -A satır_sayısı "aranacak_ifade" dosya_adı
şeklinde komut girerek sağlarız.
Sonucun üzerindeki kaç satırın gözükeceğini -B
parametresi sayesinde grep -B satır_sayısı "aranacak_ifade" dosya_adı
şeklinde komut girerek sağlarız.
Baştan ve sondan kaç satır görüntüleneceğini ise -C
parametresi sayesinde grep -C satır_sayısı "aranacak_ifade" dosya_adı
şeklinde komut girerek sağlarız.
Şimdi ise sıklıkla kullanılan pipe ile grep
kullanımına bakalım.
Pipe nedir diyecek olursanız kabaca iki işlemi(process) birbirine bağlayan |
görünümündeki yardımcı argüman diyebiliriz. Zaten daha önce de iki işlemin birbirine bağlanması gereken durumlarla karşılaşmış ve pipe kullanmıştık.
grep
ile kullanımına geçecek olursak örneğin masaüstünde yer alan dosyalardan yalnızca "metin" isimli olanları listelemek isteyelim. Bunun için ilk olarak masüstünde yer alan dosyalarımızı listelemek üzere komut satırına ls
daha sonra ise ls
komutundan gelecek olan çıktıları pipe yardımı ile grep
komutuna bağlayarak listelenen bütün bu dosyalar içerisinden sadece "metin" adı geçenleri filtreleyebilelim..
Bu işlemi gerçekleştirmek için ls | grep "metin"
komut bütününü kullanıyorum.
grep
komutunun kullanım şekli ve alanı elbette bu kadar ile sınırlı değil ancak sizler daha fazla bilgiye nasıl ulaşacağınızı biliyorsunuz.
find
find
komutu da hemen hemen daha önce görmüş olduğumuz locate
komutu ile aynı görevi görüyor. Örneğin, isminin birazını bildiğimiz ama dosya dizinini tam olarak hatırlamadığımız dosyaları bulmamıza yardımcı oluyor.
Komut kullanım kalıbı find dosya_yolu -name aranacak_ifade
şeklindedir. Tam kullanım şekli için aşağıdaki örneği inceleyebilirsiniz.
Çıktıda etc konumda yer alan içerisinde "local" ifadesi geçen dosyalar komutumuz sayesinde listelenmiş oldu. Ancak aradığımız şeyi bulmak adına değiştirilme tarihi, boyut, dosya-dizin gibi ayrıntıları belirterek çıktıları daha spesifik şekilde sınırlandırabiliriz. Bazı özel arama parametreleri açıklayalım hemen.
- type f : Yalnızca dosyalar.
- type d : Yalnızca dizinler.
- size +500k : 500 KB'tan büyük olan dosyalar.
- size -500k : 500 KB'tan küçük olan dosyalar.
- ctime 10 : Tam olarak 10 gün önce değişikliğe uğramış dosya/dizinler.
- ctime -10 : 10 günden daha kısa bir süre önce değişikliğe uğramış dosya/dizinler.
- ctime +10 : 10 günden daha uzun bir süre önce değişikliğe uğramış dosya/dizinler.
- perm 755 : Yalnızca erişim izni 755 olan dosya/dizinler. Örnek olması açısından yukarıdaki arama parametrelerinin ilk ikisinin çıktılarını aşağıya ekliyorum.
xargs
xargs
komutunun görevi kabaca kendisinden önce verilen girdi verilerini kendisinden sonrakine tek tek aktarmaktır. Biliyorum böyle denilince hiçbir şey anlaşılmıyor. O yüzden xargs
komutunu find
komutuyla birlikte kullanarak örnek üzerinden komutumuzu ve kullanım mantığını açıklamış olalım.
Örneğin -min.jpg uzantılı bir resim dosyasını araştırıp daha sonra bulduğumuz bu dosyayı silelim. Ben duvar kağıdı için daha önce internetten bir -min.jpg uzantılı bir resim indirmiştim. Bu resim hem indirilenler(downloads) hem de resimler konumunda yer alıyor, söylediğim gibi aslında dosyanın konumunu biliyorum ancak komutun kullanımını denemek üzere dosyanın konumunu bilmiyormuşçasına bir test edelim. Testimizde root dizinindeki -min.jpg uzantılı dosyaları araştıralım ve silelim.
Çıktıda da görüldüğü gibi -min.jpg uzantılı resim dosyalarını tek tek bulup silmeden önce, çıktıda belirtilen konumlarda bulunuyorlardı. Ancak arama ve tek tek otomatik olarak silme işlemini gerçekleştirmemiz ile birlikte dosyalar silindi. Silinme durumunu da tekrar arama işlevindeki find
komutunu vererek teyit etmiş olduk.
Komutumuzun işleyişi tam olarak şöyle oldu;
find /root -name *-min.jpg
komutu ile root dizini altındaki tüm -min.jpg uzantılı dosyaları listeledik.
Bu listelenen dosya konum ve varlık bilgilerini xargs
komutuna pipe( | )
argümanı sayesinde aktardık.
xargs
komutu ise eline geçen bu bilgiler sayesinde dosyanın konumunu saptayarak tek tek silme işlemini gerçekleştirebildi.
xargs
komutu exec
isimli başka bir komuta benzer şekilde çalışmaktadır. Merak edip öğrenmek isteyen arkadaşlar ayrıca exec
komutuna bakabilirler.
Dosya Kopyalama-Taşıma-Silme İşlemleri
Bu kısımda dosyaları kopyalama taşıma ve silme gibi işlemleri ele alacağız. Zaten kullanacağımız komutlar kısa oldukları için kullanımı ve akılda kalması çok kolay. İlk olarak dosya kopyalama işlemi ile anlatıma başlayalım.
cp
cp
komutu kopyalama işlevindedir. Kullanımı cp kaynak hedef
şeklindedir. Örnek üzerinden açıklayalım.
Komutumuzu açıklayacak olursak;
Desktop dizinindeyken ls
komutu ile bulunduğumuz dizindeki dosyaları listeliyoruz. Ve çıktıda da görüldüğü üzere masaüstünde "filazof" isimli bir belge bulunuyor.
cd yeni_dizin
komutuyla yeni_dizin konumuna gidiyoruz.
ls
komutu ile buradaki dosyaları listeliyoruz. Bu dizinde ise yalnızca "yeni" isimli bir klasör mevcut.("filazof" isimli dosyanın bu konumda bulunmadığını teyit etmiş olduk.)
cd ..
komutu ile bir önceki dizine dönüyoruz.
"filazof" dosyasını yeni_dizin konumuna taşımak üzere cp filazof yeni_dizin
şeklinde komutumuzu kullanıyoruz.
Daha sonrasında ise cd yeni_dizin
komutu ile yeni_dizin konumuna gidip ls
komutu yazarak "filazof" isimli dosyamızın kopyalandığını teyit etmiş oluyoruz.
Eğer bir dosyayı A dizininden B dizinine taşırsak ve B dizini içerisinde A dizininden taşıdığımız belge ile aynı isimde dosya varsa, taşıdığımız dosya mevcut konumda bulunan aynı isimdeki eski dosyanın üzerine yazılacaktır. Bu da B konumunda var olan eski dosyanın önceki içeriğinin yok olması demek. Böyle talihsiz bir durum yaşamamak için cp
komutunu kullanmadan önce -i
parametresini de eklememizde fayda var. Bu parametre cp
komutunun aynı isimli bir dosya ile karşılaşma durumunda bize onay sormasını sağlayacaktır.
Anlatılanları daha iyi anlamak adına hemen bir örnek yapalım. Daha önceden yeni_dizin konumuna taşımış olduğumuz "filazof" dosyasını -i
parametresini kullanarak tekrar cp
komutu ile taşımaya çalışalım.
Çıktıda da görüldüğü gibi -i
parametresini kullanarak yazdığımız kopyalama komutu bize "cp: 'Desktop/merhaba''ın üzerine yazılsın mı? " şeklinde bir uyarıda bulundu ve bizden onay bekledi.
Elbette bu işlemleri çoklu dosya taşıma için de kullanabiliriz.
Hangi komutu neden kullandık zaten bir önceki örneğe benzer olduğu için tekrar açıklamıyorum. Çıktıları inceleyerek çok rahat şekilde anlayabilirsiniz.
Eğer o anda çalıştığımız dizine başka bir konumdan dosya kopyalamak istersek komutumuzu cp kopyalanacak_dosya_konumu .
şeklinde kullanabiliriz. Nokta( . ) bizim o anda bulunduğumuz çalışma konumunu ifade ediyor. Örneği incelediğinizde her şey daha net anlaşılacaktır.
Görüldüğü üzere kopyalanacak olan dosyanın konumunu belirttik ancak bulunduğumuz konuma yani kopyalamak istediğimiz konumun direk adresini belirtmemize gerek kalmadı. Bunun yerine bulunduğumuz konumu temsil eden .
(nokta) kullanmamız dosyanın kopyalanmasını sağladı.
Eğer bulunduğumuz konumdan bir üst konuma kopyalamak istersek komutu cp dosya_adresi ..
şeklinde kullanmamız yeterli olacaktır.
Çıktıları karşılaştırarak dosyayı bir önceki dizine kopyalamayı (iki nokta) ..
ile kolaylıkla yapabildiğimizi görebilirsiniz.
(Eğer "deneme" isimli dosyayı kopyalarken kullandığımız komutta yer alan, dosyanın konumunu belirtme kısmı kafanızı karıştırdıysa belirteyim; çıktıda kopyalanan konumda yer alan ~ işareti ana dizin adresini yani root kullanıcısı için /root
konumunu belirtiyor. "deneme" isimli dosya bu konumda olduğu için direk bu şekilde bir kullanımı tercih ettim. Bunun yerine cp /root/deneme ..
komutunu da kullanabilirdim.)
mv
Bu komut dosya taşıma ve uzantı değiştirme gibi işlevlere sahiptir. Dosya taşıma işlevi tıpkı cp
komutunda olduğu gibidir. Yani komutun kullanımı mv dosya_konumu taşınacak_konum
şeklindedir.
rm
Dosya dizin silme işlevinde kullandığımız komuttur. Kullanımı rm silinecek_dosya_dizin
şeklindedir.
Dosyalar tekil olarak silinebileceği gibi çoklu silme işlemi de gerçekleştirilebilir. Hatta daha önce gördüğümüz joker karakterleri de kullanırsak isim, uzantı gibi filtrelere göre sınırlandırarak toplu dosya silme işlemi gerçekleştirebiliriz. Örnek olması açısından masaüstünde yer alan 2 adet .py uzantılı dosyayı tek seferde rm *.py
komutu ile siliyorum.
Joker karakterlerin kullanım alanları oldukça geniştir. Sizler de ihtiyacınıza göre filtreleme yaparak bu işlemleri istediğiniz doğrultuda gerçekleştirebilirsiniz.(Bu konuyu detaylıca ileride Joker Karakterler kısmında ele alacağız.)
shred
Bu komut sayesinde dosyalarımızı daha güvenli şekilde silebiliriz. shred
komutu dosyanın içerisine rastgele bitler yazarak dosyanın okunmaz hale gelmesini sağlıyor. Parametresiz kullanımda dosyaya 3 kez rastgele bit eklerken n
parametresini kullanarak bu eklenecek olan rastgele bit sayısını istediğimiz doğrultuda düzenleyebiliyoruz. Eğer yapılan işlemi komut satırından takip etmek istersek v
parametresini de kullanabiliriz. Ayrıca u
parametresini kullanmamız halinde dosya işlem sonrasında silinir.
Alıştırmalar Hakkında
Öğrendiğiniz bilgilerin kalıcı olması için mutlaka bolca alıştırma yapmalısınız.Burada belirtilen alıştırmalar dışında da kendi kendinize özellikle de zorlandığınız konularda bol bol alıştırmalar yapın. Aksi halde öğrendiğiniz bilgiler kısa sürede unutulup gidecektir. Yani gerçekten öğrenmek istiyorsanız lütfen öğrendiğinizi hissede kadar alıştırmalar yapın.
"a", "b", "c","d" adlarında 4 klasörü tek seferde oluşturun ve 4 klasörü tek seferde kontrollü yani tek tek onay isteyecek şekilde silin.
cat
komutu ile dosya oluşturup içerisine "deneme metni" şeklinde bir ifade yazın.
cat
komutu yardımıyla içerisinde ifadelerin yer aldığı dosyayı silerek yeni ifadeler ekleyin.
İçerisinde ifadelerin yer aldığı dosyaya cat
komutu ile ekleme yapın.
Bulunduğun konumdaki dosya ve dizinlerin bilgilerini "bilgiler" isimli bir dosyaya kaydet.
Mevcut bir dosya içeriğini "kopya" isimli bir dosya oluşturarak aktar.
Oluşturmuş olduğun kopya isimli dosyayı cat
komutu ile konsoldan oku.
Herhangi bir dosya içeriğini ters şekilde konsola bastır.
Herhangi bir dosya içeriğini dizeleri sondan başa doğru çevirerek ters şekilde konsola bastır.
Konsola "Selamlar" ifadesini bastır.
echo
komutu yardımıyla "örnek" isminde bir dosya oluştur ve aynı zamanda dosyaya "örnek metin" şeklinde bir ifade ekle.
more
komutu ile /etc
dizini içerisindeki profile
isimli dosyayı okuyun.
/etc
dizini içerisindeki profile
isimli dosyanın ilk 10 satırını ekrana bastırın.
/etc
dizini içerisindeki profile
isimli dosyanın son 10 satırını ekrana bastırın.
/etc
dizini içerisindeki profile
isimli dosyanın ilk 8 satırını ekrana bastırın.
/etc
dizini içerisindeki profile
isimli dosyanın son 5 satırını ekrana bastırın.
/etc
dizini içerisindeki profile
isimli dosyanın içeriğini satır numaraları ile birlikte görüntüleyin.
Herhangi bir dosya içeriğini a' dan z' ye alfabetik sıralanmış şekilde konsola bastırın.
Herhangi bir dosya içeriğini z' den a' ya ters alfabetik sıralanmış şekilde konsola bastırın.
Herhangi iki dosyayı aynı anda yan yana olacak şekilde konsola bastırın.
cmp
komutunu kullanarak benzer iki dosya arasındaki farkları sorgulayın.
grep
komutu ile /etc
dizini içerisindeki profile
isimli dosyada "if" ifadesinin geçip geçmediğini sorgulayın.
grep
komutunu kullanarak elde ettiğiniz arama sonuçlarının sonrasındaki yer alan 2 satırın daha basılmasını sağlayın.
grep
komutunu kullanarak elde ettiğiniz arama sonuçlarının öncesindeki yer alan 3 satırın daha basılmasını sağlayın.
grep
komutunu kullanarak elde ettiğiniz arama sonuçlarının öncesinde ve sonrasında yer alan 1 satırın daha basılmasını sağlayın.
/root
konumundayken bulunduğunuz dizindeki içerikleri listeleyip grep
komutu yardımıyla "D" ifadesi ile başlayanları filtreleyerek konsola bastırın
find
komutunu kullanarak /etc
dizini içerisindeki "doc" ifadesiyle başlayan tüm klasör ve dosyaları bularak listeleyin.
find
komutunu kullanarak /etc
dizini içerisindeki "doc" ifadesiyle başlayan tüm dosyaları(yani yalnızca dosyaları) bularak listeleyin.
find
komutunu kullanarak /etc
dizini içerisindeki "doc" ifadesiyle başlayan tüm klasörleri(yani yalnızca klasörleri) bularak listeleyin.
find
komutunu kullanarak /etc
dizini içerisindeki tam olarak 5 gün önce değişikliğe uğramış tüm dosya ve dizinleri bularak listeleyin.
find
komutunu kullanarak /etc
dizini içerisindeki 5 günden daha kısa bir süre önce değişikliğe uğramış tüm dosya ve dizinleri bularak listeleyin.
find
komutunu kullanarak /etc
dizini içerisindeki 5 günden daha uzun bir süre önce değişikliğe uğramış tüm dosya ve dizinleri bularak listeleyin.
find
komutunu kullanarak /etc
dizini içerisindeki 50 günden daha kısa bir süre önce değişikliğe uğramış olan tüm dosyaları(yani yalnızca dosyaları) bularak listeleyin.
root
dizini içerisinde sonu .png ile biten tüm resim dosyalarını bulup xargs
komutu yardımıyla bu dosyaların bulundukları konum bilgilerini bir dosyaya aktarın.
Masaüstü konumuna bir dosya oluşturun ve daha sonra bu dosyayı Documents
(Dokümanlar) dizinine kopyalayın.
Documents
(Dokümanlar) dizinine kopyalamış olduğunuz dosyayı Downloads
(İndirilenler) dizinine taşıyın.
Downloads
(İndirilenler) dizinine taşımış olduğunuz dosyayı silin.
Bir dosya oluşturun ve içerisine birkaç ifade ekleyip kaydedin. Daha sonra dosya içeriğini shred
komutu yardımıyla 7 kez rastgele bit eklemek suretiyle okunamaz hale getirip silin. Bu işlemleri de konsoldan takip edebilecek şekilde yerine getirin.(hepsini tek seferde bir komut ile yapın)
Geri Bildirimde Bulunun
Sizlere daha verimli bir kaynak sunabilmemiz için, uygulamada veya dokümantasyonlarda yer alan tüm hata ve eksiklerimizi bize bildirebilirsiniz.