Alternatif untuk menemukan? [Tutup]

30

Apakah ada findprogram alternatif dengan antarmuka CLI yang lebih konvensional? findbekerja dan mengharapkan parameter dengan cara yang sangat berbeda dari sebagian besar utilitas lain.

Klarifikasi: Saya mencari sebuah program yang sebagian besar fungsinya hampir sama dengan find dengan antarmuka commandline yang berfungsi dan terasa seperti rekomendasi commandline POSIX (atau setidaknya GNU).

Tamás Szelei
sumber
7
GNU find tidak menghormati pedoman POSIX (atau bahkan GNU) untuk baris perintah. Misalnya, pemesanan parameter, opsi multi-karakter dengan satu tanda hubung dll. Berbeda dari pada program yang sesuai.
Tamás Szelei
3
Saya tahu, dan saya selalu bisa melakukan apa yang saya inginkan, dengan satu atau lain cara. Saya baru saja mengenal ackdan bertanya-tanya apakah ada yang lebih baik findjuga.
Tamás Szelei
2
Tidak. Anda tahu, saya tidak ingin bahasa pemrograman yang kecil, tetapi penemuan yang lebih sederhana, lebih intuitif dan lebih konsisten (bahkan jika itu berarti hilangnya beberapa fungsi lanjutan). Ketika saya menghadapi tugas yang membenarkan penulisan program, saya lakukan.
Tamás Szelei
2
find keduanya konsisten (lihat jawaban saya) dan intuitif. Ini tidak seperti pemilihan pendahuluan bernama aneh. -exec berarti mengeksekusi, -cetak berarti mencetaknya, -nama berarti mencocokkan nama. Dalam praktiknya, tipe 3 dan -tipe pertama mencakup 95% dari kasus penggunaan. Untuk semua kasus lain, ada orang yang menemukannya.
Mel
3
@tamas Saya mengedit satu jam yang lalu dan memberi tahu Anda tidak ada alternatif selain mencari. Dan mungkin ls -R kalau dipikir-pikir. Alternatif lain adalah program GUI yang meniru find. Kalau tidak, Anda harus menentukan apa yang ingin Anda temukan untuk dilakukan. Berjalan dir pohon? Saring nama file? Memberitahu Anda file mana yang lebih baru?
Mel

Jawaban:

11

Ini adalah kesalahpahaman umum.

Temukan mengikuti sintaks opsi. Anda hanya membingungkan pendahuluan ekspresi dengan opsi:

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

Alternatifnya adalah temukan. Tetapi menemukan mengimplementasikan sintaks ekspresi sendiri karena menyediakan seperangkat lebih kaya opsi filter dan aksi. Tidak ada alternatif yang dapat melakukan hal yang sama, hanya karena itu akan berlebihan.

Mel
sumber
5
Bahkan jika itu salah saya, ini tidak menjawab pertanyaan saya.
Tamás Szelei
Apa perbedaan antara ekspresi (hanya satu yang diizinkan?), Cmd (dito?), Opsi dan argumen?
pengguna tidak dikenal
@user tidak diketahui - perintah find mengimplementasikan sintaks ekspresi sendiri. Ekspresi, ketika diberikan, adalah argumen terakhir pada baris perintah. Ketika tidak ada, ekspresi memutuskan untuk -cetak.
Mel
Ah - sekarang saya mengerti, [cmd] tidak mengikuti [ekspresi], tetapi ini adalah deskripsi dari baris sebelumnya.
pengguna tidak diketahui
2
OP menegaskan bahwa find"mengharapkan parameter dengan cara yang sangat berbeda dari sebagian besar utilitas lain". Anda menyatakan bahwa OP adalah "membingungkan ekspresi primer dengan opsi". Apakah sebagian besar utilitas lain bahkan memiliki konsep "ekspresi primer"? Jika tidak, bukankah itu menunjukkan poin OP? Dan itu benar-benar bukan bagian yang paling aneh dari penggunaan find. Apa yang melibatkan CLI lainnya {}(yang tentu saja harus dihindari entah bagaimana)?
Kyle Strand
10

Itu tergantung pada fungsi tepat findyang Anda andalkan. Jika (terutama) fungsi penemuan, beberapa shell mendukung gumpalan rekursif. Misalnya, dengan 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 memiliki lebih banyak kemungkinan seperti menemukan melalui kualifikasi glob (lihat menjelang akhir man zshexpn). Sebagai contoh:

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

Bash 4 juga memiliki **/(Anda harus mengaktifkannya dengan shopt -s globstar), tetapi tidak seperti kualifikasi glob.

jmtd
sumber
10

Saya akan melihat locate. Ini akan melihat melalui database file dan dengan cepat mencetak nama jalur yang cocok dengan apa yang Anda berikan.

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:~$ 

Seperti yang Anda lihat, ini adalah kecocokan sub-teks: jika Anda memberikannya odg, maka itu akan cocok dengan dg odg e. Tetapi jika Anda memberikannya .odg, maka itu tidak akan terjadi.

Namun ada satu kelemahannya: ia membutuhkan database. Basis data ini perlu diperbarui ketika ada perubahan. Instalasi Fedora 13 saya memasukkan ini ke crontab harian.

Kevin M.
sumber
Saya sukalocate
Andrew Lambert
1
Selain itu, cari juga menerima pola (saya baru tahu ini).
Adam Byrtek
5

Apa yang kamu coba temukan? Jika Anda biasanya mencari file kode sumber, lihatlah ack. Ini pada dasarnya alat pencarian kode sumber, tetapi -fsaklar ack akan menemukan file yang cocok dengan tipe file yang diberikan.

Jadi, jika Anda ingin menemukan semua file Perl dalam direktori, misalnya, cukup:

ack -f --perl

Jika Anda tidak suka tipe file yang dikenali ack, Anda dapat menambahkan milik Anda di ~/.ackrc.

ack bukan pencari file untuk keperluan umum find, tetapi jika Anda bekerja dengan kode sumber, ini bisa sangat berguna.

Andy Lester
sumber
1
Ini bukan apa yang ditanyakan oleh pengguna tetapi orang mungkin menemukan sangat berguna untuk menemukan dalam kode sumber (seperti grep) The Silver Searcher , silversearcher-agpaket pada distro utama.
Pablo A
-1

Salah satu hal hebat yang harus dipelajari oleh setiap programmer adalah: Jika Anda tidak dapat menemukan alat, buat sendiri!

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

Saya mungkin menulis yang lebih baik, dengan -tmenyaring jenis, dll.

Sunting : Di atas adalah skrip Bash. Dibutuhkan argumen baris perintah dan meneruskannya untuk menemukan sebagai nilai opsi -name. Contoh sederhana saja. Karena saya memasang jawaban ini, saya menemukan skrip python ini:

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

Antarmukanya terlihat bagus, tapi saya belum menguji kinerjanya. Mungkin patut dicoba.

xixixao
sumber
1
Benar untuk membangun pernyataan alat sendiri. Tapi setidaknya jelaskan bagaimana naskah kecil Anda seharusnya bekerja.
jippie
1
$<tidak melakukan sesuatu yang berguna di Bash saya. Apa yang Anda harapkan? Apakah yang Anda maksud "$@"sebenarnya? Atau "$1"(yang pada dasarnya apa artinya ini di Makefile)?
tripleee
1
@tripleee - $<adalah cshsetara dengan read- Saya menduga ia berarti bahwa.
DarkHeart
-2

Cara paling standar untuk menemukan sesuatu di unix's.

du -a <directory>|grep <pattern>| awk  '{print $2}'
Johnny smith
sumber
1
grep | awkadalah antipattern. Lihat penggunaan tidak bergunagrep . Jika Anda ingin membuat parametris pola, mungkindu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee
@ tripleee Itu info yang sangat membantu awk, tetapi salah satu keuntungan besar dari filosofi UNIX adalah bahwa seseorang tidak perlu memahami semua fitur dari alat yang lebih kompleks (seperti awkdan find) untuk membangun jaringan pipa yang dapat melakukan yang diinginkan tugas. grep | awkmungkin tidak optimal (atau, pada sistem multithread yang berkinerja tinggi grep, mungkin saja itu!), tetapi sederhana .
Kyle Strand