Linux find Komutu Kullanımı İle Dosya ve Dizin Arama
find
komutu, Linux sistem yöneticilerinin cephaneliğindeki en güçlü araçlardan biridir. Kullanıcı tarafından verilen bir ifadeye dayalı olarak bir dizin hiyerarşisinde dosya ve dizinleri arar ve eşleşen her dosya üzerinde kullanıcı tarafından belirlenen eylemi gerçekleştirebilir.
Dosyaları ve dizinleri izinlerine, türlerine, tarihlerine, sahipliklerine, boyutlarına ve daha fazlasına göre aramak için find
komutunu kullanabilirsiniz. Ayrıca grep
veya sed
gibi diğer araçlarla da birleştirilebilir.
1. find
Komutu Syntax
find
komutunun genel syntax'ı aşağıdaki gibidir:
find [options] [path...] [expression]
options
özniteliği, sembolik bağların, hata ayıklama seçeneklerinin ve optimizasyon yöntemlerinin işlenmesini kontrol eder.path...
özniteliği, find'in dosyaları arayacağı başlangıç dizinini veya dizinlerini tanımlar.expression
özniteliği, seçeneklerden, arama kalıplarından ve operatörlerle ayrılmış eylemlerden oluşur.
Bir dizindeki dosyaları aramak için find
komutunu çağıran kullanıcının o dizinde okuma izinlerine sahip olması gerekir.
Aşağıdaki örneğe bir göz atalım:
find -L /var/www -name "*.js"
-L
seçeneği (options),find
komutuna sembolik linkleri de bulmasını söyler./var/www
(path…) aranacak dizini belirtir.-name "*.js"
(expression),.js
(JavaScript dosyaları) ile biten dosyaları aramayı söyler.
2. Dosya İsimleriyle Arama Yapmak
Dosyaları adına göre bulmak, muhtemelen find
komutunun en yaygın kullanımıdır. Bir dosyayı adıyla bulmak için -name
seçeneğini ve ardından aradığınız dosyanın adını kullanın.
Örneğin, /home/linuxize
dizininde document.pdf
adlı bir dosyayı aramak için aşağıdaki komutu kullanırsınız:
find /home/linuxize -type f -name document.pdf
Büyük/küçük harfe duyarsız bir arama yapmak için -name
seçeneğini -iname
ile değiştirin:
find /home/linuxize -type f -iname document.pdf
Yukarıdaki komut “Document.pdf”, “DOCUMENT.pdf” ..vb. ile eşleşecektir.
3. Dosya Uzantılarıyla Arama Yapmak
Dosyaları uzantıya göre aramak, dosyaları ada göre aramakla aynıdır. Örneğin, /var/log/nginx
dizininde .log.gz
ile biten tüm dosyaları bulmak için şunu yazarsınız:
find /var/log/nginx -type f -name '*.log.gz'
Eğer aradığınız kelime içinde gerçekten *
işareti olması gerekiyorsa escape karakterleri ile \*
shell'in bu karakteri yorumlamamasını söyleyebilirsiniz.
Ayrıca, *.log.gz
regex'iyle eşleşmeyen tüm dosyaları bulmak için -not
seçeneğini kullanabilirsiniz. Örneğin, *.log.gz
ile bitmeyen tüm dosyaları bulmak için şunları kullanırsınız:
find /var/log/nginx -type f -not -name '*.log.gz'
4. Dosya Tipleriyle Arama Yapmak
Bazen normal dosyalar, dizinler veya sembolik bağlantılar gibi belirli dosya türlerini aramanız gerekebilir. Linux'ta her şey bir dosyadır.
Dosyaları türlerine göre aramak için -type
seçeneğini ve dosya türünü belirtmek için aşağıdaki tanımlayıcılardan birini kullanın:
f
: normal dosyad
: dizinl
: sembolik bağc
: karakter cihazlarıb
: block cihazlarıp
: adlandırılmış pipe (FIFO)s
: socket
Örneğin, geçerli çalışma dizinindeki tüm dizinleri bulmak için şunları kullanırsınız:
find . -type d
Genel bir örnek olarak, chmod
komutunu kullanarak web sitesi dosya izinlerini teker teker 644
ve dizin izinlerini 755
olarak değiştirmek -exec
komutuyla mümkün olacaktır:
find /var/www/my_website -type d -exec chmod 0755 {} \;
find /var/www/my_website -type f -exec chmod 0644 {} \;
5. Dosya Boyutlarıyla Arama Yapmak
Dosya boyutuna göre dosyaları bulmak için, boyut ölçütleriyle birlikte -size
parametresini kullanabiliriz. Dosya boyutunu belirtmek için aşağıdaki ekleri kullanabilirsiniz:
b
: 512-byte blocks (default)c
: bytesw
: two-byte wordsk
: KilobytesM
: MegabytesG
: Gigabytes
Aşağıdaki komut, /tmp
dizini içindeki tam olarak 1024
baytlık tüm dosyaları bulacaktır:
find /tmp -type f -size 1024c
find
komutu ayrıca belirtilen boyuttan daha büyük veya daha küçük dosyaları aramanıza da olanak tanır.
Aşağıdaki örnekte, mevcut çalışma dizini içinde 1MB
'den küçük tüm dosyaları arıyoruz. Boyut değerinden önceki -
sembolüne dikkat edin:
find . -type f -size -1M
1MB
'den büyük dosyaları aramak istiyorsanız, +
sembolünü kullanmanız gerekir:
find . -type f -size +1M
Bir boyut aralığındaki dosyaları bile arayabilirsiniz. Aşağıdaki komut 1MB
ile 2MB
arasındaki tüm dosyaları bulacaktır:
find . -type f -size +1M -size 2M
6. Dosya Tarihleriyle Arama Yapmak
find
komutu ayrıca son değişiklik, erişim veya değişiklik zamanına göre dosyaları arayabilir.
Boyuta göre arama yaparken olduğu gibi, "büyüktür" veya "küçüktür" için artı ve eksi simgelerini kullanın.
Diyelim ki birkaç gün önce samba yapılandırma dosyalarından birini değiştirdiniz ama hangisiydi unuttunuz. .conf
ile biten ve son beş gün içinde değiştirilmiş /etc/samba/conf.d
dizini altındaki tüm dosyaları kolayca filtreleyebilirsiniz:
find /etc/samba/conf.d -name "*.conf" -mtime 5
İşte -daystart
seçeneğini kullanarak değişiklik tarihine göre dosyaları filtrelemenin başka bir örneği. Aşağıdaki komut, /home
dizinindeki 30
gün öncesine kadar değiştirilen tüm dosyaları listeleyecektir:
find /home -mtime +30 -daystart
6. Dosya İzinleriyle Arama Yapmak
-perm
seçeneği, dosya izinlerine göre dosyaları aramanıza izin verir.
Örneğin, /var/www/html
dizini içinde tam olarak 775
izinli tüm dosyaları bulmak için şunları kullanırsınız:
find /var/www/html -perm 644
Sayısal modun önüne eksi -
veya /
koyabilirsiniz.
Eğik çizgi /
kullanıldığında, en az bir kategori (kullanıcı, grup veya diğerleri) bir dosyanın eşleşmesi için en azından ilgili bitlere sahip olmalıdır.
Aşağıdaki örnek komutu göz önünde bulundurun:
find . -perm /444
Yukarıdaki komut, kullanıcı, grup veya diğerleri için ayarlanmış okuma izinlerine (4
) sahip tüm dosyaları eşleştirecektir.
Önek olarak -
kullanılıyorsa, dosyanın eşleşmesi için en azından belirtilen bitlerin ayarlanması gerekir. Aşağıdaki komut, sahibi ve grubu için okuma ve yazma izni olan ve diğer kullanıcılar tarafından okunabilen dosyaları arayacaktır:
find . -perm -664
6. Dosya Sahipleriyle Arama Yapmak
Belirli bir kullanıcıya veya gruba ait dosyaları bulmak için -user
ve -group
seçeneklerini kullanabilirsiniz.
Örneğin, linuxize
kullanıcısının sahip olduğu tüm dosya ve dizinleri aramak için şunu çalıştırırsınız:
find / -user linuxize
İşte gerçek dünyadan bir örnek. Diyelim ki www-data
kullanıcısının sahip olduğu tüm dosyaları bulmak ve eşleşen dosyaların sahipliğini www-data
'dan nginx
'e değiştirmek istiyorsunuz:
find / -user www-data -type f -exec chown nginx {} \;
7. Dosya Aramak ve Bulunan Dosyaları Silmek
Tüm eşleşen dosyaları silmek için, eşleşme ifadesinin sonuna -delete
seçeneğini ekleyebilirsiniz.
Bu seçeneği yalnızca sonucun silmek istediğiniz dosyalarla eşleştiğinden emin olduğunuzda kullandığınızdan emin olun. -delete
seçeneğini kullanmadan önce eşleşen dosyaları yazdırmak her zaman iyi bir fikirdir.
Örneğin, /var/log/
dizininden .temp
ile biten tüm dosyaları silmek için şunları kullanırsınız:
find /var/log/ -name `*.temp` -delete
-delete
seçeneğini çok dikkatli kullanın. find
komutu bir expression olarak değerlendirilir ve önce -delete
seçeneğini eklerseniz komut belirttiğiniz başlangıç noktalarının altındaki her şeyi siler.Dizinler söz konusu olduğunda, find
yalnızca rmdir
gibi boş dizinleri silebilir.
8. Özet
Çeşitli seçenekler ve kriterler ile find
komutunu nasıl kullanacağınızı gösterdik.
Bu makale, Linux sistemlerinizdeki dosyaları nasıl bulacağınız konusunda size temel bir anlayış sağlamak için yazıldı. Ayrıca find man sayfasını ziyaret edebilir ve find
komutunun diğer tüm güçlü seçeneklerini okuyabilirsiniz.