31 Ocak 2021 Pazar

find komutu name seçeneği - Belirtilen glob/wildcard'a Uyanları Kabul Eder

Giriş
name seçeneği düzenli ifade (regular expression) değil glob/wildcard kullanır. dolayısıyla "*" karakterini kullanabiliriz. Açıklaması şöyle
The -name predicate takes a glob, not a regular expression.
In a regular expression, * would match zero or more of the preceding item. But since this is a glob, it matches zero or more of any character. That is, * in a glob means the same thing as .* in a regular expression.
Wildcard dilediğimiz yerde kullanılabilir. Wildcard not ile birlikte kullanılabilir. Not için istersek harfle "not" veya "!" yazabiliriz.

2. -regex Alternatifi
Açıklaması şöyle. glob/wildcard yerine regex kullanmak mümkün ancak ben bu yöntemi hiç sevmedim.
GNU find's -regex non-standard extension does take a regexp (old style emacs type by default), but that's applied on the full path (like the standard -path which also takes wildcards), not just the file name (and are anchored implicitly)

So to find files of type directory whose name starts with machine, you'd need:

find . -name 'machine*' -type d
Or:

find . -regextype posix-extended -regex '.*/machine[^/]*' -type d
-name yerine - regex ne zaman lazım olur?
Elimizde şöyle bir komut olsun. Bu komut çalışmaz. Çünkü -name ile globbing yerine brace expansion yapılmaya çalışılıyor
find $directory -name '*.[hc]' -exec clang-format -i {} \;
 Bu  gibi durumlarda regex daha iyi. Şöyle yaparız
find . -regextype posix-extended -regex '.*\.(c|h|cpp)'
3. Kullanım
Örnek - karakter sayısı
Şöyle yaparız
find "$HOME" -type d -name 'bowtie*1.[!2]*'
Açıklaması şöyle
The pattern matches names starting with bowtie and then contains 1.n, where n is not 2.
Örnek - not name kullanımı
Şöyle yaparız. Bu sefer not için harfle "not" kullanılıyor.
$ find -not -name mongodb.log -name "*.log"
Örnek - not extension kullanımı
Şöyle yaparız.
find src -type f -name '*.ts' ! -name '*.d.ts'
Örnek - not name kullanımı
İsmi belirtilen örüntüye uymayanları listelemek için not kullanılır. İsmi "." ve ".." olmayan dizinleri bulmak için şöyle yaparız.
find . -maxdepth 1 -type d ! -name "\.*"
Örnek - and name ve not name kullanımı
İsmi master ile başlayan ancak master-2018 ile başlamayanları silmek için şöyle yaparız.
$ find -name 'master*' \! -name 'master-2018*' -print0 |
     xargs -0 echo rm -fr
Örnek - extension
mp3 dosyalarını bir üst dizine taşımak için şöyle yaparız.
find . -path "*/flac/*" -name '*.mp3' -execdir mv -t ../ {} +
Örnek - name + extension
unl uzantılı dosyaları bulmak için şöyle yaparız.
find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

Hiç yorum yok:

Yorum Gönder