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

30

Есть ли альтернативная findпрограмма с более обычным интерфейсом CLI? findработает и ожидает параметры совершенно иначе, чем большинство других утилит.

Пояснение: я ищу программу, которая в основном имеет те же функции, что и find, с интерфейсом командной строки, который работает и выглядит как рекомендации командной строки POSIX (или, по крайней мере, GNU).

Тамас Селеи
источник
7
GNU find не соответствует рекомендациям POSIX (или даже GNU) для командной строки. Например, упорядочение параметров, многосимвольные опции с одной чертой и т. Д. Отличаются от соответствующих программ.
Тамас Селеи
3
Я знаю и всегда могу делать то, что намереваюсь, так или иначе. Я только недавно узнал, ackи мне было интересно, есть ли лучше find.
Тамас Селеи
2
Нет. Видите ли, я не хочу маленький язык программирования, но более простую, более интуитивную и более последовательную находку (даже если это означает потерю некоторой расширенной функциональности). Когда я сталкиваюсь с задачей, которая оправдывает написание программы, я справляюсь.
Тамас Селей
2
Находят и последовательный (см. мой ответ) и интуитивно понятный. Это не так, как праймериз называют странными. -exec означает выполнение, -print означает его печать, -name означает совпадение имени. На практике, первые 3 и -типа покрывают 95% случаев использования. Для всех остальных случаев есть человек найти.
Мел
3
@tamas Я редактировал час назад и сказал, что нет альтернативы, кроме locate. И, может быть, LS -R подумать об этом. Другими альтернативами являются программы с графическим интерфейсом, которые эмулируют поиск. В противном случае вы должны указать, что вы хотите сделать, чтобы найти альтернативу. Прогулка, деревья? Фильтровать имена файлов? Подскажите какие файлы новее тогда?
Мел

Ответы:

11

Это распространенное заблуждение.

Найти следует за синтаксисом опций. Вы просто путаете первичные выражения с параметрами:

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

Альтернатива находится. Но find реализует свой собственный синтаксис выражений, потому что он предоставляет более богатый набор параметров фильтров и действий. Нет альтернативы, которая могла бы сделать то же самое, просто потому что это было бы излишним.

Мел
источник
5
Даже если это моя вина, это не отвечает на мой вопрос.
Тамас Селей
В чем разница между выражением (допускается только одно?), Cmd (dito?), Параметрами и аргументами?
пользователь неизвестен
@user unknown - команда find реализует собственный синтаксис выражений. Выражение, если оно задано, является последним аргументом в командной строке. При отсутствии выражения разрешается в -print.
Мел
Ах, теперь я вижу, [cmd] не следует за [выражением], но это описание строки раньше.
пользователь неизвестен
2
OP утверждает, что find«ожидает параметры совершенно иначе, чем большинство других утилит». Вы утверждаете, что OP "путает первичные выражения с опциями". У большинства других утилит вообще есть понятие "праймериз выражения"? Если нет, разве это не демонстрирует точку зрения ОП? И это действительно не самая странная часть использования 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), но ничего похожего на глобальные квалификаторы.

jmtd
источник
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) The Silver Searcher , silversearcher-agпакет на основных дистрибутивах.
Пабло А
-1

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

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

Я мог бы написать лучше, с -tфильтром типов и т. Д.

Изменить : выше это скрипт Bash. Он принимает аргумент командной строки и передает его для поиска в качестве значения опции -name. Просто простой пример. Так как я поднял этот ответ, я нашел этот скрипт на python:

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

Интерфейс выглядит красиво, но я не проверял его производительность. Может стоит проверить.

xixixao
источник
1
Верно для построения собственного инструмента. Но хотя бы объясните, как ваш маленький сценарий должен работать.
Джиппи
1
$<не делает ничего полезного в моем Bash. Что вы ожидаете от этого? Вы имеете в виду на "$@"самом деле? Или "$1"(что в принципе означает это в Makefile)?
tripleee
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
@tripleee Это очень полезная информация awk, но одно из больших преимуществ философии UNIX заключается в том, что не нужно понимать все функции более сложных инструментов (таких как awkи find), чтобы создавать конвейеры, которые могут выполнять желаемое задача. grep | awkможет быть не оптимальным (или, на производительной многопоточной системе с высокооптимизированной grep, возможно, так и будет!), но это просто .
Кайл Стрэнд