Rehber

Linux'ta find komutu: ada, boyuta ve tarihe göre dosya arama örnekleri

Güncellendi: · Skillaria.Top

find komutu dizin ağacını gezer ve dosyaları koşullara göre seçer: find /yol -name '*.log' ada göre arar, -type f yalnızca dosyaları, -size +100M 100 MB'tan büyükleri, -mtime -7 son bir hafta içinde değişenleri bulur. Koşullar birleştirilebilir; bulunanlar üzerinde -exec, -delete ile işlem yapılabilir veya liste xargs'a aktarılabilir.

find komutu dizin ağacında gezinir ve dosyaları ad, tür, boyut, değişiklik tarihi, sahip ve izin gibi koşullara göre bulur. Genel yapı şöyledir: find [nerede arayacağı] [koşullar] [işlem]. Aşağıda yaygın görevler için find linux örnekleri topladık: bir yapılandırma dosyasını bulmak, eski logları temizlemek, diskte yeri dolduran dosyayı tespit etmek.

find komutunun sözdizimi

find /var/log -type f -name '*.log' -mtime +30 -print

Parçalara ayıralım:

  • /var/log — başlangıç noktası. Art arda birden fazla dizin veya . (geçerli dizin) verilebilir. Yol belirtilmezse GNU find geçerli dizinde arar.
  • -type f -name '*.log' -mtime +30 — koşullar (belgelerde bunlara test denir). Aralarında varsayılan olarak mantıksal “VE” bulunur.
  • -print — işlem: yolu yazdırır. Başka bir işlem yoksa otomatik olarak eklenir.

find, tüm alt dizinlerde özyinelemeli çalışır. Sistem yollarında normal kullanıcı olarak çalıştırırsanız çıktı Permission denied satırlarıyla dolar. Hata akışını yönlendirerek bunları gizleyebilirsiniz:

find / -name 'nginx.conf' 2>/dev/null

Ada göre arama: -name ve -iname

-name koşulu yalnızca dosya adını (yolsuz) desenle karşılaştırır. Desen * (herhangi karakterler), ? (tek karakter) ve [abc] (verilenlerden biri) destekler.

# tam ad
find /etc -name 'hosts'

# tüm .conf dosyaları
find /etc -name '*.conf'

# büyük/küçük harf duyarsız: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'

# report_1.csv ... report_9.csv
find . -name 'report_?.csv'

Deseni her zaman tırnak içine alın. Tırnak olmazsa kabuk *.conf desenini geçerli dizindeki dosyalara göre kendisi genişletir; find desen yerine dosya adlarının listesini alır ve sonuç beklenmedik olur veya paths must precede expression hatasıyla komut düşer.

Yola göre arama: -path ve -regex

Dizin de önemliyse, yalnızca ada değil tüm yola bakan -path kullanın:

# yalnızca src dizinlerinin içindeki .js dosyaları
find . -path '*/src/*' -name '*.js'

Karmaşık desenler için -regex (düzenli ifade de tam yola uygulanır) ve büyük/küçük harfi yok sayan -iregex vardır:

find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'

Bir dizini dışarıda bırakma

find'ın örneğin node_modules veya .git içine girmesini istemiyorsanız -prune kullanılır:

find . -path ./node_modules -prune -o -name '*.js' -print

Okunuşu şöyledir: “yol ./node_modules ise içine girme, aksi halde (-o) *.js dosyalarını yazdır”. Sondaki açık -print zorunludur; yoksa dışarıda bırakılan dizin de çıktıya girer. Daha basit ama daha yavaş bir yol -not -path '*/node_modules/*' seçeneğidir: find dizini yine gezer, sadece sonucu süzer.

Türe göre arama: -type

DeğerNe arar
-type fnormal dosyalar
-type ddizinler
-type lsembolik bağlantılar
-type ssoketler
-type padlandırılmış borular (FIFO)
# yalnızca logs adlı dizinler
find / -type d -name 'logs' 2>/dev/null

# boş dosyalar ve boş dizinler
find . -type f -empty
find . -type d -empty

# kırık sembolik bağlantılar
find . -xtype l

Boyuta göre arama: -size

-size sonuna birim eklenmiş bir sayı alır: c — bayt, k — kilobayt, M — megabayt, G — gigabayt. + “büyük”, - “küçük”, işaretsiz ise “tam olarak” anlamına gelir.

# Tüm sistemde 100 MB'tan büyük dosyalar
find / -type f -size +100M 2>/dev/null

# 10 ile 50 MB arası
find . -type f -size +10M -size -50M

# 1 KB'tan küçük
find . -type f -size -1k

Burada bir incelik var: boyut birime yukarı yuvarlanır. Bu yüzden -size -1M yalnızca boş dosyaları bulur; boş olmayan her dosya yuvarlamadan sonra “en az 1 megabayt” sayılır. Kesin sınırlar için daha küçük birimler kullanın: -size -1024k.

Diskte ne yer kaplıyor

find'ı ls ve sort ile birleştirerek en büyük dosyaları görebilirsiniz:

find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm  1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root   root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root   adm   96M Oct 14 09:15 /var/log/nginx/access.log

Tüm dizinlerin boyutunu görmek için du -sh daha uygundur; find ise yeri tek bir büyük dosyanın derinlerde doldurduğu durumlarda işe yarar.

Tarihe göre arama: -mtime, -mmin, -newer

Her dosyanın üç zaman damgası vardır ve find bunların her birine göre filtreleyebilir:

KoşulDamgaBirim
-mtime / -mminiçeriğin değiştirilmesigün / dakika
-atime / -aminson okunmagün / dakika
-ctime / -cminmeta verinin değişmesi (izin, sahip, ad)gün / dakika

İşaretler boyuttaki gibi çalışır: -mtime -7 — 7 günden az önce değişmiş, -mtime +30 — 30 günden önce değişmiş.

# Son bir hafta içinde değişenler
find ~/projects -type f -mtime -7

# 30 günden eski loglar
find /var/log -type f -name '*.log' -mtime +30

# Son 15 dakikada değişenler
find /etc -type f -mmin -15

Günler tam 24 saatlik dönemler olarak sayılır, kesirli kısım atılır. Bu yüzden -mtime +1 24 saat değil 48 saatten eski dosyaları bulur; bu sık görülen bir tuzaktır. Kesinlik gerekiyorsa dakikaya geçin: -mmin +1440.

Başka bir dosyadan veya tarihten yeni olanlar

# deploy.lock değiştirildikten sonra değişen dosyalar
find . -type f -newer deploy.lock

# belirli bir tarihten sonra değişenler (GNU find)
find . -type f -newermt '2026-10-01'

# tarih aralığında
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'

Sahibe ve izinlere göre arama

# alice kullanıcısına ait dosyalar
find /home -user alice

# sahibi artık var olmayan dosyalar (kullanıcı silindikten sonra)
find / -nouser 2>/dev/null

# izinleri tam olarak 777 olan dosyalar
find /var/www -type f -perm 777

# herkesin yazabildiği dosyalar
find /var/www -perm -o=w

# SUID biti olan dosyalar — güvenlik denetiminde faydalıdır
find / -perm -4000 -type f 2>/dev/null

-perm üç biçimde çalışır: işaretsiz — izinler tam olarak eşleşir; - ile — belirtilen bitlerin en azından hepsi açık olmalı; / ile — bitlerden en az biri açık olmalı.

Koşullarda mantık: VE, VEYA, DEĞİL

Koşullar varsayılan olarak “VE” ile birleşir. “VEYA” için -o, olumsuzlama için ! veya -not kullanılır. Gruplama parantezlerle yapılır; parantezlerin kabuktan kaçırılması gerekir:

# jpg veya png resimler
find . -type f \( -name '*.jpg' -o -name '*.png' \)

# .tmp dosyaları hariç her şey
find . -type f ! -name '*.tmp'

Parantez olmadan -type f yalnızca “VEYA” çiftinin ilk koşuluna uygulanır ve sonuçta *.png adlı dizinler de çıkar. \( ve \) etrafındaki boşluklar zorunludur.

Arama derinliği: -maxdepth ve -mindepth

# yalnızca geçerli dizinde, alt dizinlere inmeden
find . -maxdepth 1 -type f -name '*.sh'

# ikinci iç seviyeden başlayarak
find . -mindepth 2 -name '*.md'

# başka dosya sistemlerine geçme
find / -xdev -type f -size +1G

-maxdepth seçeneğini yolun hemen arkasına, diğer koşullardan önce yazın; aksi halde GNU find uyarı verir. -xdev seçeneği / altında aramada faydalıdır: find /proc, ağ diskleri ve bağlı diskler içine girmez.

Bulunanlar üzerinde işlem: -exec, -delete, xargs

-exec: her dosya için komut çalıştırma

{} yerine find dosyanın yolunu koyar. Komut \; veya + ile biter:

# her dosya için ayrı çalıştırma
find . -name '*.sh' -exec chmod +x {} \;

# tüm dosyalar tek listede — daha hızlı
find . -name '*.log' -exec gzip {} +

# her dosya için onay sorarak
find . -name '*.bak' -ok rm {} \;

+ seçeneği yolları paketler ve komutu çok daha seyrek çalıştırır; binlerce dosyada bu yöntem belirgin biçimde hızlıdır. \; seçeneği ise komut yalnızca bir dosya kabul ettiğinde veya {} sonda değilse gerekir.

-delete: bulunanları silme

# Önce silinecekleri gözden geçirin
find /tmp/build -type f -name '*.o' -mtime +7

# Sonra silin
find /tmp/build -type f -name '*.o' -mtime +7 -delete

Her zaman önce -delete olmadan çalıştırıp listeyi kontrol edin. -delete seçeneğini en sona koyun: find ifadeyi soldan sağa değerlendirir ve find . -delete -name '*.o' dizindeki her şeyi siler, adı ise ondan sonra kontrol eder.

find ve xargs

Klasik ikili, dosya listesini xargs ile başka bir programa vermektir. Boşluk içeren adlarda sorun çıkmaması için sıfır baytlık ayracı kullanın:

find . -type f -name '*.txt' -print0 | xargs -0 wc -l

xargs'ın -P seçeneği işlemi paralel çalıştırır:

find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng

find ve grep: dosyaların içinde metin arama

find dosyaları bulur, içeriklerini aramaz. Seçilen dosyaların içinde bir satır aramak için bunları grep'e verin:

# /etc/nginx içindeki yapılandırmalarda listen 8080 geçen yerler
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4:    listen 8080;

-H dosya adını, -n satır numarasını yazdırır; grep -l ise yalnızca eşleşme bulunan dosya adlarını verir. Filtre yalnızca uzantıya göreyse grep'in kendisi yeterlidir: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.

Özel çıktı biçimi: -printf

GNU find yalnızca yolu değil, başka bilgileri de yazdırabilir; örneğin boyut, tarih ve ad:

find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n

Burada %s bayt cinsinden boyut, %T... değişiklik tarihinin parçaları, %p yoldur. Betikler için faydalıdır: ls çıktısını ayrıştırmanız gerekmez.

Günlük kullanım için find linux örnekleri özeti

GörevKomut
Dosyayı ada göre bulmakfind / -name 'file.txt' 2>/dev/null
Büyük/küçük harf duyarsızfind . -iname '*.jpg'
Yalnızca dizinlerfind . -type d -name 'cache'
1 GB'tan büyük dosyalarfind / -xdev -type f -size +1G
Son bir günde değişenlerfind . -type f -mtime -1
Son bir saatte değişenlerfind . -type f -mmin -60
30 günden eski logları silmekfind /var/log/app -name '*.log' -mtime +30 -delete
Boş dizinlerfind . -type d -empty
Tüm dizinlerin izinlerini değiştirmekfind . -type d -exec chmod 755 {} +
Dosyalar içinde metinfind . -name '*.py' -exec grep -l 'TODO' {} +
Dosyaları saymakfind . -type f | wc -l

Sık yapılan hatalar

  • Desen tırnaksız. find . -name *.log komutu, geçerli dizinde en az bir .log dosyası varsa bozulur. '*.log' yazın.
  • Permission denied seli. 2>/dev/null ekleyin veya gerçekten tüm disk gerekiyorsa sudo ile çalıştırın.
  • -delete'in yanlış yerde olması. Her zaman sonda olmalı ve önce silmeden bir kontrol çalıştırılmalıdır.
  • Boşluklu adlar boru hattında. find ... | xargs rm “My File.txt” dosyasını iki argümana böler. -print0 ile xargs -0 veya -exec kullanın.
  • -mtime'dan tam gün beklemek. Kesin aralıklar için -mmin veya -newermt kullanın.

Özet

find, dosya sisteminde evrensel bir arama aracıdır: yol, ad, tür, boyut, tarih ve izin koşulları ve ardından bir işlem. Beş temel parçayı öğrenin — -name, -type, -size, -mtime ve -exec ... + — ve çoğu görev tek satırda çözülür. Bu find linux örneklerini kendi terminalinizde deneyin; find ile grep, sed ve awk'ın birlikte kullanımını ise Linux kursunun terminalde metin işleme dersinde uygulamalı olarak ele alıyoruz.

Sık sorulan sorular

find ile locate arasındaki fark nedir?

locate, önceden oluşturulmuş bir ad veritabanında arar; bu yüzden çok hızlıdır, ancak updatedb komutu veritabanını güncelleyene kadar yeni oluşturulan dosyaları görmez. find ise diski anlık olarak gezer ve boyut, tarih veya izinlere göre süzebilir.

Dosyayı adına göre değil, içeriğine göre nasıl bulurum?

find içeriği okumaz. grep -rn 'metin' /yol kullanın veya find . -name '*.conf' -exec grep -l 'metin' {} + ile birleştirin.

find kök dizinde neden yavaş çalışıyor?

Tüm dizinleri gezer; buna /proc, /sys ve bağlı diskler de dahildir. Aramayı belirli bir dizinle sınırlayın, -xdev ve -maxdepth ekleyin veya -prune ile gereksiz yerleri dışarıda bırakın.

find sonuçlarını tarihe göre sıralayabilir miyim?

Evet: find . -type f -printf '%T@ %p\n' | sort -n dosyaları en eskiden en yeniye sıralar; %T@ değişiklik zamanını epoch'tan itibaren saniye olarak verir.

Boş dizinleri nasıl bulup silerim?

find . -type d -empty -delete komutu tüm boş dizinleri siler; boşalan iç dizinler de dahildir. Önce -delete olmadan çalıştırıp listeyi kontrol edin.

Bu konuyu videoyla öğrenin

Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git