Bulmak için alternatif? [kapalı]


30

findDaha geleneksel bir CLI arayüzüne sahip alternatif bir program var mı ? finddiğer pek çok uygulamadan parametreleri acı verici şekilde farklı bir şekilde çalışır ve bekler.

Açıklama: POSIX (ya da en azından GNU) komut satırı önerileri gibi çalışan ve hissettiren bir komut satırı arabiriminde bulduğu işlevlerle çoğunlukla aynı işlevselliğe sahip bir program arıyorum.


7
GNU bulma komut satırı için POSIX (hatta GNU) kurallarına uymaz. Örneğin, parametrelerin sıralanması, tek bir çizgi ile çok karakterli seçenekler vb. Uyumlu programlardan farklıdır.
Tamás Szelei

3
Biliyorum ve istediğimi istediğim gibi yapabilirim. Daha yeni tanıdım ackve daha iyi olup olmadığını merak ediyordum find.
Tamás Szelei

2
Hayır. Görüyorsunuz, küçük bir programlama dili istemiyorum, ama daha basit, daha sezgisel ve daha tutarlı bir keşif (bazı gelişmiş işlevselliklerin kaybı anlamına gelse bile). Bir program yazmayı haklı çıkaran bir görevle karşılaştığımda, anladım.
Tamás Szelei

2
bul hem tutarlı (benim cevabımı gör) hem de sezgisel. İlkellerin tuhaf olduğu söylenemez. -exec yürütmek, -print yazdırmak, -sim bir adın eşleşmesi anlamına gelir. Uygulamada, eski 3 ve tipi kullanım durumlarının% 95'ini kapsamaktadır. Diğer tüm durumlar için, bir erkek bulduk.
Mel,

3
@tamas Bir saat önce düzenledim ve konum dışında başka alternatif olmadığını söyledim. Ve belki de -R düşünmeye gelir. Diğer alternatifler, bulmayı taklit eden GUI programlarıdır. Aksi halde, alternatif bulmanın ne yapmasını istediğinizi belirtmeniz gerekir. Dir ağaçlar yürü? Dosya adlarını filtrele? Hangi dosyaların daha yeni olduğunu söyle?
Mel

Yanıtlar:


11

Bu yaygın bir yanılgıdır.

Bul seçenekleri sözdizimi izler. Sadece ifade ilkelerini seçeneklerle karıştırıyorsunuz:

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

Alternatif konumdur. Ancak, bul daha zengin bir filtre ve eylem seçenekleri kümesi sağladığından, kendi ifade sözdizimini uygular. Aynı şeyi yapabilecek bir alternatif yoktur, çünkü gereksiz olabilir.


5
Benim suçum olsa bile, bu sorumu cevaplamıyor.
Tamás Szelei

İfade (sadece bir taneye izin verilir mi?), Cmd (dito?), Seçenekler ve args arasındaki fark nedir?
kullanıcı bilinmeyen,

@ user unknown - find komutu, kendi ifade sözdizimini uygular. İfade verildiğinde, komut satırındaki son argümandır. Olmadığında, ifade -print'e çözümlenir.
Mel,

Ah - şimdi anlıyorum, [cmd], [ifadeyi] izlemiyor, ama daha önceki satırın açıklaması.
kullanıcı bilinmeyen

2
OP, find"parametreleri diğer pek çok uygulamadan zahmetli bir şekilde beklediğini" iddia ediyor . OP’nin “ifade ilkelerini seçeneklerle karıştırdığını” belirtiyorsunuz. Diğer pek çok uygulamada "ifade primerleri" kavramı bile var mı? Eğer değilse, bu OP'nin amacını göstermez mi? Ve bu gerçekten kullanmanın en garip kısmı değil find. Başka {}hangi CLI'yı içerir (elbette hangisinden kaçınmalı)?
Kyle Strand

10

Bu, güvendiğiniz kesin işlevselliğe bağlıdır find. Bulma işlevi (ilke olarak) ise, bazı kabuklar özyinelemeli küreleri destekler. Örneğin zsh:

% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c 
a/bar.c  a/b/foo.c  baz.c

Zsh, glob elemelerinde çok daha fazla buluş imkanı sunuyor (sonuna bakın man zshexpn). Örneğin:

ls -l **/*(.)  ≈   find -type f -ls
ls *(m-2u:$USER:)  ≈  find -mtime -2 -user $USER

Bash 4'te ayrıca **/(onu etkinleştirmeniz gerekir shopt -s globstar) var, ancak glob elemelerine benzer bir şey yok.


10

Bir göz atardım locate. Dosyalarının veritabanına bakacak ve verdiklerinizle eşleşen yol adlarını hızla yazdıracaktır.

kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$ 

Gördüğünüz gibi, bir alt metin maç: bunu verirsen odg, o zaman d maç olacak Odg e. Ama verirseniz .odg, o zaman olmaz.

Bir dezavantajı var, ancak: bir veritabanına ihtiyacı var. İşler değiştiğinde bu veritabanının güncellenmesi gerekir. Fedora 13 kurulumumda bunun günlük bir crontab olması sağlandı.


Ben seviyorumlocate
Andrew Lambert

1
Dahası, bulun ayrıca kalıpları da kabul eder (bunu daha yeni öğrendim).
Adam Byrtek

5

Ne bulmaya çalışıyorsun? Genelde kaynak kod dosyalarını arıyorsanız, bir göz atın ack. Temelde bir kaynak kod arama aracıdır, ancak ack'ın -fanahtarı belirli bir dosya türüyle eşleşen dosyaları bulur.

Yani bir dizindeki tüm Perl dosyalarını bulmak istiyorsanız, örneğin, sadece:

ack -f --perl

Ack'ın tanıdığı dosya türlerini beğenmezseniz, kendinize bir tane de ekleyebilirsiniz ~/.ackrc.

ack gibi genel amaçlı bir dosya bulucu değildir find, ancak kaynak kodla çalışıyorsanız çok kullanışlı olabilir.


1
Bu kullanıcı istedi ama insanlar kaynağı (grep gibi) kodunda bulmak için çok yararlı bulabileceğiniz ne değildir Gümüş Searcher , silversearcher-agana dağıtımlar üzerinde paketin.
Pablo A,

-1

Her programcının öğrenmesi gereken en güzel şeylerden biri şudur: Eğer bir araç bulamazsanız, kendiniz bir tane oluşturun!

#!/usr/bin/bash
find -name $<

Daha iyi bir tane yazabilirim, -tfiltre tiplerine vb.

Düzenleme : Yukarıdaki bir Bash betiğidir. Komut satırı argümanını alır ve bunu -name seçeneğinin değeri olarak bulmak için iletir. Sadece basit bir örnek. Bu cevabı verdiğimden beri bu python betiğini buldum:

https://github.com/sjl/friendly-find/

Arayüz güzel görünüyor, ancak performansını test etmedim. Kontrol etmeye değer olabilir.


1
Kendi araç deyimini oluşturmak için geçerlidir. Ama en azından küçük senaryonun nasıl çalışması gerektiğini açıkla.
jippie

1
$<Bash'imde faydalı bir şey yapmıyor. Ne yapmasını bekliyorsun? Gerçekten mi demek istiyorsun "$@"? Veya "$1"(Temel olarak bunun Makefile'de anlamı nedir)?
üçlü

1
@tripleee - $<olduğu csheşdeğer readOnun anlamına geliyordu tahmin ediyorum -.
DarkHeart

-2

Unix'lerde bir şeyler bulmak için en standart yol.

du -a <directory>|grep <pattern>| awk  '{print $2}'

1
grep | awkbir antipattern. Yararsız kullanımıgrep bakın . Deseni parametreleştirmek istiyorsanız, belkidu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
üçlü

@tripleee Bu awk, UNIX felsefesinin en büyük avantajlarından biri hakkında , ancak istenen bilgileri gerçekleştirebilecek boru hatları inşa etmek için daha karmaşık araçların ( awkve gibi find) tüm özelliklerini anlama ihtiyacı duymamasıdır. görev. grep | awken uygun olmayabilir (veya yüksek düzeyde optimize edilmiş grep, okuyuculu bir sistemde , belki de olabilir!), ancak basittir .
Kyle Strand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.