21 Haziran 2020 Pazar

find komutu

1. Synopsis
Şöyledir.
SYNOPSIS
     find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
2. Dosyaları Bulma Sırası
Dosyaları bulma sırası her zaman aynı değildir. Açıklaması şöyle
The order find processes the files is not deterministic. It may be just the same order as the underlying system call gives, which probably depends on the underlying filesystem structure and can be essentially random.
3. Farklı Path'ler Yan Yana Verilebilir
Örnek
Hem /usr/local/bin hem de /bin dizinler arama yapmak için şöyle yaparız.
$ find /usr/local/bin/ /bin/ -printf '%P\n'
4. Seçenekler
Bazı arama seçenekleri şöyle
Büyüklüğe göre arama seçenekleri

Access Denied veya Permission Denied Hataları
Access denied hataları STDERR akımına yazılır. Bu hataları görmemek için STDERR akımını /dev/null'a yönlendiririz. Şöyle yaparız.
find /home -iname "*.pdf" 2>/dev/null
Bir diğer çözüm ise STERR akımını STDOUT akımına yönlendirmek ve hataları grep -v ile göstermemek. Şöyle yaparız.
find /home -iname "*.pdf" 2>&1 | grep -v "access denied"
- atime seçeneği
Son x günde erişilmemiş dosyaları listeler. Dosyaya erişilmesi değiştirildiği anlamına gelmez. Bu seçenek te aynı -mtime seçeneği gibi gün cinsinden sayar. Yani 1.5 gün diye bir şey bilmez. 1 gün, 2 gün, 3 gün şeklinde sayar. Açıklaması şöyle
When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.
-E seçeneği
Extended regex anlamına gelir. Şöyle yaparız.
find -E . -iregex ".*optimizing.*"
-delete seçeneği
delete seçeneği yazısına taşıdım

-empty seçeneği
Örnek - not empty
Sadece hex zero içeren dosyaları bulmak için şöyle yaparız. Burada not empty kullanılıyor
find path/to/startdir/ -type f ! -empty -exec grep -zvL '^$' {} +
Örnek
Elimizde şöyle bir yapı olsun.
Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt
parentdir'ın altındaki boş dosyaları/dizinleri silmek için şöyle yaparız.
find Parent -empty -delete
Çıktı olarak şunu alırız
Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt
Örnek
parentdir'ın altındaki boş dizinleri silmek için şöyle yaparız.
find /home/user/parentdir/* -type d -empty -delete
-exec seçeneği
exec seçeneği yazısına taşıdım

-iname seçeneği
Aranacak dosya ismini belirtir. Şöyle yaparız.
find /etc -iname '*abc*' -delete
-inum seçeneği
Belirtilen inode numarasını kullanır. Sözdizimi şöyledir.
find <somepath> -inum <inode_number> ...;
Örnek
Dosyaların inode numarasını görmek için şöyle yaparız.
$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ...
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ...
Bu dosyaları silmek için şöyle yaparız.
$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
Örnek
Şöyle yaparız
#inode numarasını bul
ls -lid -- *env*

# İlk sütundaki inode numarasını al ve aşağiya ekle
find . -inum <inode> -delete
Örnek
Şöyle yaparız. inum olarak dizinin numarasını veriyoruz ve içini listeliyoruz.
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst  Outlook Data File  Outlook Data File.sbd  Trash      Unsent Messages
Inbox.pst     Outlook Data File.msf  Sent.pst       Trash.msf  Unsent Messages.msf
-iregex seçeneği
regex seçeneği yazısına taşıdım

-max-matches seçeneği
Çok fazla sonuç dönüyorsa ve bunu sınırlandırmak istersek kullanırız.
Örnek
Şöyle yaparız.
find -max-matches 1000 -exec mv {} /path/to/collection1 \+; 
-maxdepth seçeneği
Açıklaması şöyle
Since the find command is recursive, it can sometimes return quite a lot of results. If you want to limit the number of levels, then use the -maxdepth option. Similarly, you can use -mindepth to define a minimum depth to go to, before results start to be returned.
Örnek
Şöyle yaparız. Bakılacak derinliği belirtir.
find . -maxdepth 2 -regextype egrep -type f -regex './dump-[0-9]{4}\.zip' -delete
Örnek
Sadece belli bir derinlikteki dosyaları bulmak için şöyle yaparız
find . -name "*.txt" -maxdepth 2 -mindepth 2
-name seçeneği
name seçeneği yazısına taşıdım

-path seçeneği
path seçeneği yazısına taşıdım

printf seçeneği
printf seçeneği yazısına taşıdım

-prune seçeneği
Bu seçenek bayağı tartışmalı. 
Örnek
Bazı dizinlere girilmemesini sağlar. dir1,dir2,dir3 dizinlerine girmemek için şöyle yaparız.
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
Örnek
"." (nokta) karakteri ile başlayan dizinlere girmemek için şöyle yaparız
find . -mindepth 1 -type d \( -name '.*' -prune -o -print \)
-regex seçeneği
regex seçeneği yazısına taşıdım


xdev seçeneği
Farklı dosya sistemleri aynı inode numarasına sahip olabilir. Sadece başlangıç noktasındaki dosya sistemi yani tek bir dosya sisteminde arama yapmak için şöyle yaparız.
find / -xdev -inum 12582925

Hiç yorum yok:

Yorum Gönder