3

Есть ли у вас простая идея определить псевдоним в .bashrc для поиска команды, которую вы хотите найти (если вы забыли ее имя) на вашем компьютере, посещая все каталоги bin, возможно, с помощью regex?

например

ls /bin /sbin /usr/bin | grep program

У вас есть идеи, как использовать регулярные выражения для поиска всех каталогов bin?

9 ответов9

4

вы можете использовать whereis чтобы найти все двоичные файлы, соответствующие имени, которое вы ищете

> whereis -b ls
ls: /bin/ls

Опция -b предназначена только для двоичных файлов, без нее вы также найдете исходные тексты и файлы man-страниц.

> whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
3

Этот работает без внешних зависимостей (только встроенные команды оболочки) и будет работать с пеплом busybox.

Иногда вы не можете вспомнить, как это пишется, хотя для тех из нас, кому просто нужно найти близкое соответствие, есть эта функция, добавляемая в bashrc:

find_bin(){
for x in ${PATH//://*${1}* }*${1}*; do
    [ -f "$x" ] && echo $x
done
}

grep find_bin перечислит все двоичные файлы в $ PATH с именем grep вместе с их путем {grep, egrep, fgrep, bugreport, ... }

это может принять следующий синтаксис:

  • а * я - с аз
  • стоит?z - с <1 символом> z
  • а [0-9] z - с аз
  • a [az] z - с помощью az
  • a [AZ] z - с помощью az
  • а * {а, г} * г - с .... такой же , как в [AZ] г

если вы иногда хотите, чтобы оно совпадало только с целым словом и не сообщало egrep, fgrep или bugreport при вводе grep, вы можете удалить звездочки и добавить их обратно в командную строку только там, где вы хотите

find_bin(){
for x in ${PATH//://${1} }${1}; do
    [ -f "$x" ] && echo $x
done
}

для этого нужен один дополнительный синтаксис для сопоставления начала и конца

  • * grep - будет соответствовать командам, оканчивающимся на gre (найдет grep, egrep и fgrep, но не сообщит об ошибке)
  • grep - будет соответствовать только точной строке grep
  • grep * - будет соответствовать командам, начинающимся с grep
  • все вышеприведенные шаблоны также применимы
1

which делает именно это:

which commandname
1

Используйте type функции bash. Это лучше, чем whereis потому что он идентифицирует функции, встроенные в bash и псевдонимы, а также двоичные исполняемые файлы. whereis лучше, потому что он будет выполнять какое-то сопоставление с образцом - type только то, что вы укажете.

Используйте параметр -a чтобы показать все вхождения исполняемого файла в вашем пути.

~$ type python
python is /usr/local/bin/python
~$ type -a python
python is /usr/local/bin/python
python is /usr/bin/python
python is /usr/local/bin/python
~$ whereis -b python
python: /usr/bin/python /usr/bin/python2.4 /usr/lib/python2.4 /usr/local/bin/python /usr/local/bin/python2.6 /usr/local/bin/python2.5 /usr/local/bin/python2.7 /usr/local/bin/python2.7-config /usr/local/bin/python2.5-config /usr/local/bin/python2.6-config /usr/local/lib/python2.6 /usr/local/lib/python2.5 /usr/local/lib/python2.7 /usr/include/python2.4

~$ whereis -b time
time: /usr/bin/time /usr/include/time.h
~$ type -a time
time is a shell keyword
time is /usr/bin/time
0

Чтобы поместить его в ваш .bashrc, псевдоним бесполезен, потому что псевдонимы не принимают параметры, но функция будет делать:

pfind () {
  for d in ${PATH//:/ }
  do
    find $d -regex $d/"$1"
  done
}

pfind '.*[ou]b.*h'

find ... -reges ищет регулярные выражения для всего пути, поэтому нам нужно повторить $ d.

pfind должен обозначать поиск программы (или поиск PATH).

0

Предполагая, что у вас есть пакет mlocate:

locate programname
0

В bash , если вы помните первый или два символа команды, введите <character><character><TAB><TAB> чтобы увидеть список всех команд, название которых начинается с <character><character> .

В Linux "locate string" перечислит все файлы и каталоги с "string" как часть его имени. (Сначала вам нужно будет создать свою БД с помощью updatedb . На CentOS задание cron.daily запускает updatedb .) Это не скажет вам, какой из них может быть исполняемым; это просто еще один способ найти больше информации.

0
apropos program/library/related/anything really

Выполняет поиск на страницах справочника вашего поискового слова, включая поддержку регулярных выражений. Я никогда не могу вспомнить, как пишется ncmpcpp, так что

apropos mpd

я могу найти все mpd, включая ncmpcpp

0

Вы можете использовать man -k для поиска внутри страницы руководства каждой команды:

man -k packet


PF_PACKET (7)        - packet interface on device level.
gpgsplit (1)         - Split an OpenPGP message into packets
ip6tables (8)        - IPv6 packet filter administration
iptables (8)         - administration tool for IPv4 packet filtering and NAT
lft (1)              - print the route packets trace to network host
lft.db (1)           - print the route packets trace to network host
packet (7)           - packet interface on device level.
pcap-filter (7)      - packet filter syntax
tc-bfifo (8)         - Packet limited First In, First Out queue
tc-pfifo (8)         - Packet limited First In, First Out queue
tcptraceroute (1)    - A traceroute implementation using TCP packets
tcptraceroute.db (8) - print the route packets trace to network host
tcptraceroute.mt (1) - A traceroute implementation using TCP packets
traceproto (1)       - print the route packets trace to network host
traceproto.db (1)    - print the route packets trace to network host
traceroute (1)       - print the route packets trace to network host
traceroute-nanog (1) - print the route packets trace to network host
traceroute.db (1)    - print the route packets trace to network host
traceroute6 (1)      - print the route packets trace to network host
traceroute6.db (1)   - print the route packets trace to network host


man -k "packet limited"
tc-bfifo (8)         - Packet limited First In, First Out queue
tc-pfifo (8)         - Packet limited First In, First Out queue

Числа в скобках представляют раздел справочной страницы команды, разделы 3 и 5, например, не для команд. Конечно, вы должны учитывать, что, к сожалению, некоторые команды не имеют справочной страницы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .