Альтернативу знайти? [зачинено]


30

Чи існує альтернативна findпрограма з більш звичайним інтерфейсом CLI? findпрацює і очікує, що параметри болісно відрізняються від більшості інших утиліт.

Роз'яснення: я шукаю програму, яка має в основному такий же функціонал, як і функція find з інтерфейсом командного рядка, який працює і виглядає як рекомендації щодо командного рядка POSIX (або принаймні GNU).


7
GNU find не дотримується інструкцій POSIX (або навіть GNU) для командного рядка. Наприклад, впорядкування параметрів, багатозначних параметрів за допомогою одного тире тощо відрізняються, ніж у відповідних програмах.
Tamás Szelei

3
Я знаю, і я завжди можу так чи інакше робити те, що маю намір. Я нещодавно познайомився ackі цікавився, чи є і кращий find.
Tamás Szelei

2
Ні. Розумієте, я не хочу невеликої мови програмування, а більш простої, інтуїтивнішої та більш послідовної знахідки (навіть якщо це означає втрату деякої розширеної функціональності). Коли я стикаюся із завданням, яке виправдовує написання програми, я це роблю.
Tamás Szelei

2
Знахідка є одночасно послідовною (див. мою відповідь) та інтуїтивно зрозумілою. Це не так, як праймеріз називають дивним. -exec означає виконати, -print означає надрукувати його, -name означає відповідати імені. На практиці колишній 3-типовий тип охоплює 95% випадків використання. Для всіх інших випадків знайдеться людина.
Мел

3
@tamas Я редагував годину тому і сказав вам, що немає іншого варіанту, крім як знайти. І, можливо, ls -R прийде подумати про це. Інші альтернативи - це програми GUI, що імітують пошук. В іншому випадку ви повинні вказати, що ви хочете, щоб зробити вашу альтернативу. Прогулянки дерев? Фільтрувати назви файлів? Скажіть, які файли новіші?
Мел

Відповіді:


11

Це поширена помилка.

Знайти слід синтаксис параметрів. Ви просто плутаєте праймериз виразів з параметрами:

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

Альтернатива - знайти. Але find реалізує власний синтаксис вираження, оскільки він забезпечує більш багатий набір параметрів фільтра та дії. Немає альтернативи, яка могла б зробити те саме, просто тому, що це було б зайвим.


5
Навіть якщо я винен, це не відповідає на моє запитання.
Tamás Szelei

Яка різниця між виразом (дозволений лише один?), Cmd (dito?), Параметрами та аргументами?
користувач невідомий

@user unknown - команда find реалізує власний синтаксис вираження. Вираз, коли дано, є останнім аргументом у командному рядку. Якщо він відсутній, вираз вирішується на -принт.
Мел

Ага - тепер я бачу, [cmd] не слідкує за [вираз], але це опис рядка раніше.
користувач невідомий

2
ОП запевняє, що find"очікує, що параметри болісно відрізняються від більшості інших утиліт". Ви заявляєте, що ОП "плутає праймери виразів з параметрами". Чи мають більшість інших утиліт навіть поняття «праймериз виразів»? Якщо ні, чи не це свідчить про точку ОП? І це насправді не найдивніша частина використання find. Що ще стосується CLI {}(який, звичайно, потрібно якось уникнути)?
Кайл Странд

10

Це залежить від точної функціональності, на findяку ви покладаєтесь. Якщо це (головним чином) функціонал пошуку, деякі оболонки підтримують рекурсивні кулі. Наприклад, з 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 має набагато більше можливостей пошуку за допомогою класифікаторів (дивіться наприкінці man zshexpn). Наприклад:

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

Bash 4 також має **/(вам потрібно це ввімкнути shopt -s globstar), але нічого, як глобальні класифікатори.


10

Я б поглянув locate. Він перегляне свою базу даних файлів і швидко роздрукує імена шляхів, які відповідають тому, що ви даєте.

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

Як бачите, це збіг підтексту: якщо ви дасте його odg, то він буде відповідати d odg e. Але якщо ви дасте .odg, то не буде.

Однак є один недолік: для цього потрібна база даних. Цю базу даних потрібно оновлювати, коли все змінюється. Однак у моїй установці Fedora 13 це введено у щоденний crontab.


Я люблюlocate
Ендрю Ламберт

1
Більше того, locate також приймає зразки (про це я дізнався зовсім недавно).
Адам Бертек

5

Що ви намагаєтесь знайти? Якщо ви зазвичай шукаєте файли вихідного коду, подивіться ack. Це в основному інструмент пошуку вихідного коду, але -fперемикач Ack знайде файли, які відповідають заданому типу файлу.

Отже, якщо ви хочете знайти всі файли Perl в каталозі, наприклад, просто:

ack -f --perl

Якщо вам не подобаються файли, які розпізнає Ack, ви можете додати свої власні у свої ~/.ackrc.

ack не є таким find, як шукати файли загального призначення , але якщо ви працюєте з вихідним кодом, це може бути дуже зручно.


1
Це не те, що запитував користувач, але люди можуть виявити дуже корисним для пошуку у вихідному коді (наприклад, grep) Silver Searcher , silversearcher-agпакет на основні дистрибутиви.
Пабло А

-1

Однією з чудових речей, які повинен вивчити кожен програміст, є: якщо ви не можете знайти інструмент, побудуйте свій власний!

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

Я можу написати кращу, -tдля типів фільтрування тощо.

Редагувати : вище наведено сценарій Bash. Він бере аргумент командного рядка і передає його, щоб знайти як значення параметра -name. Просто простий приклад. Оскільки я поставив цю відповідь, я знайшов цей сценарій пітона:

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

Інтерфейс виглядає добре, але я не перевіряв його продуктивність. Можливо, варто перевірити.


1
Це стосується створення власної операційної програми. Але принаймні поясніть, як має працювати ваш маленький сценарій.
джиппі

1
$<не робить нічого корисного в моєму Bash. Що ви очікуєте від цього? Ви маєте на увазі "$@"насправді? Або "$1"(що в основному означає це в Makefile)?
трійчатка

1
@tripleee - $<це cshеквівалент read- Я припускаю , що він мав в виду , що.
DarkHeart

-2

Найбільш стандартний спосіб знайти речі в Unix.

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

1
grep | awkє антипатерном. Дивіться марне використанняgrep . Якщо ви хочете параметризувати візерунок, можливоdu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
трійка

@tripleee Це дуже корисна інформація awk, але однією з найважливіших переваг філософії UNIX є те, що не потрібно розуміти всі особливості більш складних інструментів (таких як awkі find), щоб побудувати трубопроводи, які можуть виконати бажане завдання. grep | awkможе не бути оптимальним (або, у виконанні багатопотокової системи із сильно оптимізованою grep, можливо, це було б!), але це просто .
Кайл Странд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.