обяжите сочетание клавиш Выходить, zsh

locate(1) имеет только одно большое преимущество find(1): скорость.

find(1), Тем не менее, имеет много преимуществ locate(1):

  • find(1) является исконным, возвращаясь к самой первой версии Unix AT&T. Вы даже найдете, что это в сокращении встроило Linux через Busybox. Это почти универсально.

    locate(1) намного моложе, чем find(1). Самый ранний предок locate(1) не появлялся до 1983, и это не было широко доступно как"locate"до 1994, когда это было принято в GNU findutils и в 4.4BSD.

  • locate(1) также нестандартно, таким образом это не установлено по умолчанию везде. Некоторые Ose типа POSIX даже не предлагают его как опцию, и где это доступно, реализация может испытывать недостаток в функциях, которые Вы хотите, потому что нет никакого независимого стандарта, указывающего минимальный набор функций, который должен быть доступным.

    Существует фактический стандарт, будучи BSD locate(1), но это то, только потому, что другие две основных разновидности locate реализуйте все его опции: -0, -c, -d, -i, -l, -m, -s, и -S. mlocate реализации 6 дополнительных опций не в BSD locate: -b, -e, -P, -q, --regex и -w. GNU locate реализации те шесть плюс еще четыре: -A, -D, -E, и -p. (Я игнорирую псевдонимы и незначительные различия как -? по сравнению с -h по сравнению с --help.)

    BSDs и Mac OS X поставляют BSD locate.

    Большинство Linux поставляет GNU locate, но Red Hat Linux и поставка Arch mlocate вместо этого. Debian не устанавливает ни одного в своей основной установке, но предлагает обе версии в его хранилищах пакетов по умолчанию; если оба установлены сразу,"locate"выполнения mlocate.

    Oracle поставлялась mlocate в Солярисе с тех пор 11.2, выпущенный в декабре 2014. До этого, locate не был установлен по умолчанию на Солярисе. (По-видимому, это было сделано для сокращения несовместимости команды Solaris с Oracle Linux, который основан на Red Hat Enterprise Linux, который также использует mlocate.)

    IBM AIX все еще не поставляет версии locate, по крайней мере, с AIX 7.2, если Вы не устанавливаете GNU findutils от панели инструментов AIX для приложений Linux.

    HP-UX также, кажется, недостает locate в основной системе.

    Более старый "реальный" Unixes обычно не включал реализацию locate.

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

  • find(1) может выбрать файлы больше, чем просто именем. Это может выбрать:

    • возраст
    • размер
    • владелец
    • тип файла
    • метка времени
    • полномочия
    • глубина в поддереве...
  • При нахождении файлов по имени, можно искать файл использования globbing синтаксис во всех версиях find(1), или в GNU или версиях BSD, с помощью регулярных выражений.

    Текущие версии locate(1) примите шаблоны шарика как find делает, но BSD locate не делает regexes вообще. Если Вы похожи на меня и должны использовать множество типов машины, Вы предпочитаете grep фильтрация к разработке зависимости от -r или --regex.

    locate нуждается в сильной фильтрации больше, чем find делает потому что...

  • find(1) не обязательно ищет всю файловую систему. Вы обычно указываете на него на подкаталог, родитель, содержащий все файлы, на которые Вы хотите, чтобы это воздействовало. Типичное поведение для a locate(1) реализация должна извергнуть все файлы, соответствующие Вашему шаблону, оставив это grep фильтрация и такой для сокращения его извержения к размеру.

    (Злая подсказка: locate / вероятно, получит Вас список всех файлов в системе!)

    Существуют варианты locate(1) как slocate(1) которые ограничивают вывод на основе полномочий пользователя, но это не версия по умолчанию locate в любой главной операционной системе.

  • find(1) может сделать вещи в файлы, которые это находит, в дополнение только к нахождению их. Самое мощное и широко поддерживаемый такой оператор -exec, но существуют другие. В недавнем GNU и BSD находят реализации, например, Вы имеете -delete и -execdir операторы.

  • find(1) выполнения в режиме реального времени, таким образом, его вывод всегда актуален.

    Поскольку locate(1) полагается на обновленные часы или дни базы данных в прошлом, ее вывод может устареть. (Это - устаревшая проблема кэша.) Эта монета имеет две стороны:

    1. locate может назвать файлы, которые больше не существуют.

      GNU locate и mlocate имейте -e флаг, чтобы заставить его проверить на существование файла перед распечатыванием названия каждого файла, который это обнаружило в прошлом, но это съедает часть из locate преимущество скорости, и не доступно в BSD locate кроме того.

    2. locate не назовет файлы, которые были созданы начиная с последнего обновления базы данных.

    Вы учитесь быть несколько подозрительными к locate вывод, зная это может быть неправильным.

    Существуют способы решить эту проблему, но я не знаю ни о какой реализации в широком использовании. Например, существует rlocate, но это, кажется, не работает против любого современного ядра Linux.

  • find(1) никогда не имеет больше полномочие, чем пользователь, выполняющий его.

    Поскольку locate предоставляет глобальную услугу всем пользователям в системе, она хочет иметь updatedb процесс выполняется как root таким образом, это видит всю файловую систему. Это приводит к выбору проблем безопасности:

    1. Выполненный updatedb как корень, но делают его выходной файл читаемым миром так locate может работать без специальных полномочий. Это эффективно выставляет названия всех файлов в системе всем пользователям. Это может быть действительно нарушением защиты для порождения настоящей проблемы.

      BSD locate настроен этот путь на Mac OS X и FreeBSD.

    2. Запишите базу данных как читаемую только root, и сделайте locate setuid базируйтесь, таким образом, это может считать базу данных. Это означает locate эффективно должен повторно реализовать систему разрешения ОС, таким образом, она не показывает Вам файлы, которые Вы не можете обычно видеть. Это также увеличивает поверхность атаки Вашей системы, конкретно рискуя корневым нападением эскалации.

    3. Создайте специальное предложение"locate"пользователь или группа, чтобы владеть файлом базы данных и отметить locate двоичный файл как setuid/setgid для того пользователя/группы, таким образом, это может считать базу данных. Это не предотвращает нападения расширения полномочий отдельно, но это значительно смягчает ущерб, который можно было нанести.

      mlocate настроен этот путь на Red Hat Enterprise Linux.

      У Вас все еще есть проблема, тем не менее, потому что, если можно использовать отладчик на locate или заставьте это выводить ядро, можно достигнуть привилегированные части базы данных.

    Я не вижу способ создать действительно "безопасное" locate команда, за исключением выполнения его отдельно для каждого пользователя в системе, которая инвертирует большую часть ее преимущества find(1).

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

11
14.11.2013, 18:42
1 ответ

Вам нужно -s связывать фактические строки вместо виджетов:

bindkey -s jj '\e'

Хотя Вы, вероятно, хотите отобразиться jj к vi-cmd-mode виджет здесь:

bindkey jj vi-cmd-mode

(обратите внимание, что это для привязки в режиме вставки, не нормального / командного режима),

12
27.01.2020, 19:58
  • 1
    вторые работы как очарование, Спасибо! –  Alexej Magura 15.11.2013, 01:50
  • 2
    NOTE KEYTIMEOUT кажется, повреждает привязку клавиш. –  Alexej Magura 27.12.2013, 21:28
  • 3
    @AlexejMagura, просто добавляющий: установка KEYTIMEOUT слишком низко мешает zle распознавать двойное нажатие. –  UltraMaster 25.08.2014, 07:22

Теги

Похожие вопросы