find Komutu Kullanımı Hakkında

Merhaba;

Terminalde çalışırken find komutunun çok geniş bir kullanım alanı vardır. İşinize yarayabilecek bazı örnekler paylaşmak istiyorum.

find komutunu çalıştırdığınızda, dosya sisteminizi canlı olarak arar, bu da yavaş çalışmasına neden olur, ancak size Linux sisteminizdeki dosyaların anlık bir görünümünü verir. Bununla birlikte, aranan dosya sisteminin alanını sınırlayarak aramanın daha hızlı ilerleyebilmesi için find komutunun dosya sisteminde belirli bir noktada başlamasını da söyleyebilirsiniz.

Aklınıza gelebilecek hemen hemen her dosya özniteliği bir arama seçeneği olarak kullanılabilir. Dosya adları, sahiplik, izin, boyut, değişiklik süreleri ve diğer öznitelikler için arama yapabilirsiniz. Öznitelik kombinasyonlarını bile kullanabilirsiniz. Find komutunu kullanmanın bazı temel örnekleri şöyle:

$ find                              # Geçerli dizindeki tüm dosya ve dizinleri listele.
$ find /etc                         # /etc dizini içinde tüm dosya ve dizinleri listele.
$ find $HOME -ls                    # Ev dizinindeki tüm dosya ve dizinleri ayrıntılı listele.

Dosyaları ada göre bulma

Dosyaları ada göre bulmak için -name ve -iname seçeneklerini kullanabilirsiniz. Arama, dosyanın temel adına göre yapılır; Dizin adları varsayılan olarak aranmaz. Aramayı daha esnek hale getirmek için, aşağıdaki örneklerde olduğu gibi yıldız (*) ve soru işareti (?) gibi dosya eşleştirme karakterleri kullanabilirsiniz:

# find /etc -name passwd       # /etc dizininde "passwd" adlı dosyayı arar.
 /etc/pam.d/passwd
 /etc/passwd
# find /etc -iname '*passwd*'  # /etc dizininde, büyük/küçük harf duyarlılığı olmadan "passwd" içeren dosyaları arar.
 /etc/pam.d/passwd
 /etc/passwd
 /etc/passwd.OLD
 /etc/passwd
 /etc/MYPASSWD
 /etc/security/opasswd

Dosyaları boyuta göre bulma

Diskiniz doluyorsa ve en büyük dosyalarınızın nerede olduğunu öğrenmek istiyorsanız, sisteminizde dosya boyutuna göre arama yapabilirsiniz. -size seçeneği, aşağıdaki örneklerde görebileceğiniz gibi, seçilen boyuttan tam, daha küçük veya daha büyük olan dosyaları aramanıza olanak tanır:

$ find /usr/share/ -size +10M                             # /usr/share dizininde boyutu 10 MB'den büyük dosyaları bulur.
$ find /mostlybig -size -1M                               # /mostlybig dizininde boyutu 1 MB'den küçük dosyaları bulur.
$ find /bigdata -size +500M -size -5G -exec du -sh {} \;  # /bigdata dizininde boyutu 500 MB ile 5 GB arasında olan dosyaları bulur ve her birinin disk kullanımını (du -sh) gösterir.

 4.1G   /bigdata/images/rhel6.img
 606M   /bigdata/Fedora-16-i686-Live-Desktop.iso
 560M   /bigdata/dance2.avi

Dosyaları kullanıcıya göre bulma

Dosyaları bulmaya çalıştığınızda belirli bir sahip (-user) veya grup (-group) için arama yapabilirsiniz. Aşağıdaki örneklerde görebileceğiniz gibi, -not ve -or tuşlarını kullanarak, belirli kullanıcılar ve gruplarla ilişkili dosyalar için aramanızı daraltabilirsiniz:

$ find /home -user chris -ls
 131077 4    -rw-r--r--  1 chris   chris 379 Jun 29  2014 ./.bashrc

# find /home \( -user chris -or -user joe \) -ls
 131077 4    -rw-r--r--  1 chris   chris 379 Jun 29  2014 ./.bashrc      
 181022 4    -rw-r--r--  1 joe     joe    379 Jun 15  2014 ./.bashrc      

# find /etc -group ntp -ls
 131438 4 drwxrwsr-x  3 root    ntp   4096 Mar  9 22:16 /etc/ntp      

# find /var/spool -not -user root -ls
 262100    0 -rw-rw----   1 rpc      mail    0 Jan 27  2014 /var/spool/mail/rpc
 278504    0 -rw-rw----   1 joe      mail    0 Apr  3  2014 /var/spool/mail/joe
 261230    0 -rw-rw----   1 bill     mail    0 Dec 18 14:17 /var/spool/mail/bill
 277373 2848 -rw-rw----   1 chris    mail 8284 Mar 15  2014 /var/spool/mail/chris

Dosyaları izne göre bulma

Dosyaları izinlere göre aramak, sisteminizdeki güvenlik sorunlarını ortaya çıkarmanın veya erişim sorunlarını ortaya çıkarmanın mükemmel bir yoludur. Tıpkı sayıları veya harfleri kullanarak (chmod komutuyla) dosyaların izinlerini değiştirdiğiniz gibi, aynı şekilde -perm seçenekleriyle birlikte sayı veya harf izinlerine göre dosyaları da bulabilirsiniz.

İzin için sayıları kullanırsanız, üç sayının kullanıcı, grup ve diğerleri için gönderilen izinleri temsil ettiğini unutmayın. Bu üç sayının her biri, okuma (4), yazma (2) ve yürütme (1) bitlerini bir araya getirerek izin yok (0) ile tam okuma/yazma/yürütme izni (7) arasında değişir. Sayının önünde kısa çizgi (-) varsa, belirtilen bitlerin üçü de eşleşmelidir; Önünde eğik çizgi (/) varsa, bir dosyayı bulmak için yapılan aramada sayılardan herhangi biri eşleşebilir. Ne kısa çizgi ne de eğik çizgi kullanılmıyorsa tam, tam sayılar eşleşmelidir.

$ find /usr/bin -perm 755 -ls
 788884   28 -rwxr-xr-x   1 root     root        28176 Mar 10  2014 /bin/echo

$ find /home/chris/ -perm -222 -type d -ls
 144503    4 drwxrwxrwx   8 chris  chris 4096 Jun 23  2014 /home/chris/OPENDIR

-perm 755 aranarak, tam olarak rwxr-xr-x iznine sahip tüm dosya veya dizinler eşleştirilir. -perm -222 kullanılarak, yalnızca kullanıcı, grup ve diğerleri için yazma izni olan dosyalar eşleştirilir. Bu durumda, yalnızca dizinlerle eşleşmesi için d parametretsi eklendiğine dikkat edin.

$ find /myreadonly -perm /222 -type f
 685035    0 -rw-rw-r--  1 chris   chris      0 Dec 30 16:34 /myreadonly/abc

$ find . -perm -002 -type f -ls
 266230    0 -rw-rw-rw-   1 chris   chris      0 Dec 30 16:28 ./LINUX_BIBLE/abc

-perm /222 kullanarak, kullanıcı, grup veya diğer için yazma izni açık olan herhangi bir dosyayı (-type f) bulabilirsiniz. Bunu, tüm dosyaların dosya sisteminin belirli bir bölümünde (bu durumda, /myreadonly dizininin altında) salt okunur olduğundan emin olmak için yapabilirsiniz. Son örnek olan -perm /002, diğer izin bitlerinin nasıl ayarlandığına bakılmaksızın “diğer” için açık yazma iznine sahip dosyaları bulmak için çok kullanışlıdır.

Dosyaları tarih ve saate göre bulma

Her dosya oluşturulduğunda, erişildiğinde, içeriği değiştirildiğinde veya meta verileri değiştirildiğinde her dosya için tarih ve saat damgaları saklanır. Meta veriler sahibi, grubu, zaman damgasını, dosya boyutunu, izinleri ve dosyanın düğümünde depolanan diğer bilgileri içerir. Aşağıdaki nedenlerden herhangi biri için dosya verilerini veya meta veri değişikliklerini aramak isteyebilirsiniz:

Az önce bir yapılandırma dosyasının içeriğini değiştirdiniz ve hangisi olduğunu hatırlayamıyorsunuz. Bu nedenle, son 10 dakika içinde nelerin değiştiğini görmek için /etc araması yaparsınız:

$ find /etc/ -mmin -10

Birinin sisteminizi üç gün önce hacklediğinden şüpheleniyorsunuz. Bu nedenle, son üç gün içinde herhangi bir komutun sahipliğinin veya izinlerinin değiştirilip değiştirilmediğini görmek için sistemde arama yaparsınız:

$ find /bin /usr/bin /sbin /usr/sbin -ctime -3

FTP sunucunuzda (/var/ftp) ve web sunucunuzda (/var/www) 300 günden uzun süredir erişilmeyen dosyaları bulmak ve böylece silinmesi gerekip gerekmediğini görmek istiyorsunuz:

$ find /var/ftp /var/www -atime +300

Minimum ve zaman seçeneklerine bağımsız değişken olarak verdiğiniz sayıların önünde kısa çizgi (geçerli saatten dakika veya gün önceki sayıya kadar olan zamanı belirtmek için) veya artı (dakika veya gün öncesi ve daha eski sayıdan zamanı belirtmek için) gelir. Kısa çizgi veya artı işareti olmadan, tam sayı eşleştirilir.

Dosyaları bulurken ‘not’ ve ‘or’ kullanma

-not ve -or seçenekleriyle, aramalarınızı daha da hassaslaştırabilirsiniz. Belirli bir kullanıcıya ait olan ancak belirli bir gruba atanmamış dosyaları bulmak istediğiniz zamanlar olabilir. Belirli bir boyuttan daha büyük, ancak başka bir boyuttan daha küçük dosyalar isteyebilirsiniz. Veya birkaç kullanıcıdan herhangi birine ait dosyaları bulmak isteyebilirsiniz. -not ve -or seçenekleri bunu yapmanıza yardımcı olabilir.

/var/allusers adında paylaşılan bir dizin vardır. Bu komut satırı, joe veya chris’e ait dosyaları bulmanızı sağlar.

$ find /var/allusers \( -user joe -o -user chris \) -ls
  679967    0 -rw-r--r-- 1 chris chris    0 Dec 31 12:57          /var/allusers/myjoe
  679977 1812 -rw-r--r-- 1 joe   joe   4379 Dec 31 13:09          /var/allusers/dict.dat
  679972    0 -rw-r--r-- 1 joe   sales    0 Dec 31 13:02          /var/allusers/one

Bu komut satırı, joe kullanıcısına ait dosyaları arar, ancak yalnızca joe grubuna atanmamış olanları arar:

$ find /var/allusers/ -user joe -not -group joe -ls
  679972 0 -rw-r--r-- 1 joe sales  0 Dec 31 13:02 /var/allusers/one

Aramalarınıza birden fazla gereksinim de ekleyebilirsiniz. Burada, bir dosyanın joe kullanıcısına ait olması ve boyutunun da 1 MB’tan büyük olması gerekir:

$ find /var/allusers/ -user joe -and -size +1M -ls
 679977 1812 -rw-r--r-- 1 joe root 1854379 Dec 31 13:09   /var/allusers/dict.dat

Dosyaları bulma ve komutları yürütme

Find komutunun en güçlü özelliklerinden biri, bulduğunuz herhangi bir dosyada komutlar yürütme yeteneğidir. -exec seçeneğiyle, kullandığınız komut, sorun olup olmadığını sormak için durmadan, bulunan her dosyada exe olarak kesilir. -ok seçeneği eşleşen her dosyada durur ve komutu üzerinde çalıştırmak isteyip istemediğinizi sorar.

-ok kullanmanın avantajı, yıkıcı bir şey yapıyorsanız, komut üzerinde çalıştırılmadan önce her dosyayı tek tek onayladığınızdan emin olabilmenizdir. -exec ve -ok kullanmanın sözdizimi aynıdır:

$ find [options] -exec command {} \;
$ find [options] -ok command {} \;

-exec veya -ok ile, aradığınız dosyaları bulmak için istediğiniz herhangi bir seçenekle find komutunu çalıştırırsınız. Ardından -exec veya -ok seçeneğini ve ardından her dosyada çalıştırmak istediğiniz komutu girersiniz. Küme ayraçları kümesi, bulunan her dosyada komut satırının neresinin okunacağını gösterir. İsterseniz her dosya komut satırına birden çok kez eklenebilir. Satırı sonlandırmak için ters eğik çizgi ve noktalı virgül (;) eklemeniz gerekir. İşte bazı örnekler:

Bu komut, /etc dizini altında passwd adlı herhangi bir dosyayı bulur ve bu adı bir echo komutunun çıktısına ekler:

$ find /etc -iname passwd -exec echo "I found {}" \;
        I found /etc/pam.d/passwd
        I found /etc/passwd

Aşağıdaki komut, /usr/share dizini altında boyutu 5 MB’tan büyük olan her dosyayı bulur. Daha sonra du komutu ile her dosyanın boyutunu listeler. Find çıktısı daha sonra boyuta göre en büyükten en küçüğe doğru sıralanır. -exec girildiğinde, bulunan tüm girişler sorulmadan işlenir:

$ find /usr/share -size +5M -exec du {} \; | sort -nr
        116932  /usr/share/icons/HighContrast/icon-theme.cache
        69048   /usr/share/icons/gnome/icon-theme.cache
        20564   /usr/share/fonts/cjkuni-uming/uming.ttc

-ok seçeneği, bulunan her dosyanın girdiğiniz komut tarafından gerçekleştirilip gerçekleştirilmeyeceğini teker teker seçmenizi sağlar. Örneğin, /var/allusers dizininde (ve alt dizinlerinde) joe’ya ait tüm dosyaları bulmak ve bunları /tmp/joe dizinine taşımak istiyorsunuz:

# find /var/allusers/ -user joe -ok mv {} /tmp/joe/ \;
        < mv ... /var/allusers/dict.dat > ? y
        < mv ... /var/allusers/five > ? y

Yukarıdaki kodda, bulunan her dosya /tmp/joe dizinine taşınmadan önce istendiğine dikkat edin. Dosyayı taşımak için her satırda y yazıp Enter tuşuna basmanız veya atlamak için Enter tuşuna basmanız yeterlidir. find komutu hakkında daha fazla bilgi için man find yazarak yardım alabilirsiniz.

Leave a Comment