2

GNU find позволяет использовать различные форматы регулярных выражений с помощью опции -regextype , но, насколько я могу судить, я должен вводить -regextype <whatever> каждый раз, что обременительно.

Если кто-то хочет другой вид регулярного выражения, есть вероятность, что он всегда хочет этого, а не переключает тип, используемый с каждой командой. Идеальным было бы установить предпочтительный вариант регулярного выражения через файл настроек (~/.find_profile) или переменную окружения ($FIND_OPTS), но я не нашел никаких признаков того, что это возможно.

Как я могу установить regextype постоянно?

4 ответа4

2

Я не провел много испытаний этого, но, похоже, работает. Он разбирает список аргументов, чтобы find и объединяет аргументы обратно в другой список аргументов, но вставляет -regextype posix-awk перед любыми найденными аргументами -iregex или -regex .

Таким образом, манипулирование списком аргументов в оболочке иногда не позволяет правильно обрабатывать определенные конструкции цитирования, но в большинстве случаев должно работать нормально.

Просто поместите эту функцию в ~/.bashrc или в файл rc любой оболочки, которую вы запускаете.

find ()
{
    args=
    for arg in $*
    do
        case $arg in
            -iregex|-regex)
                args="$args -regextype posix-awk $arg"
                ;;
            *)
                args="$args $arg"
                ;;
        esac
    done
    set -f
    command find $args
    set +f
}
0

Этот ответ должен быть совершенно безопасным в отношении пробелов. Но, возможно, это специфично для bash ?

Он вставляет -regextype posix-extended перед первым -iregex или -regex . Сохраните это где-нибудь в вашем $PATH . И, если вы сохраните это как find , убедитесь, что вы отредактировали последнюю строку (find "$@"), иначе она просто вызовет себя в бесконечном цикле

#!/bin/bash
for ((i=1; i<= $#; ++i )) {
    if [[ "-iregex" = "${@:i:1}" ]]; then
        set -- "${@:1:i-1}" "-regextype" "posix-extended" "${@:i}"
        break
    fi
    if [[  "-regex" = "${@:i:1}" ]]; then
        set -- "${@:1:i-1}" "-regextype" "posix-extended" "${@:i}"
        break
    fi
    if [[ "--" = "${@:i:1}" ]]; then
        break
    fi
}
find "$@"

Я узнал о set -- в качестве метода редактирования аргументов командной строки здесь: https://stackoverflow.com/questions/4827690/change-a-command-line-argument-bash

Например, если четвертый аргумент - -regex , то i равен 4, и новый набор аргументов командной строки должен быть:

  • первые три оригинальных аргумента: "${@:1:i-1}"
  • ... за которыми следуют два новых аргумента: -regextype и posix-extended
  • ... с последующим четвертым и последующими аргументами: "${@:i}"
0

Использование псевдонима для find позволяет автоматически устанавливать тип регулярного выражения, но ограничивает другой доступный синтаксис:

alias find='find -regextype <whatever>'

Проблема в том, что многие необязательные аргументы для поиска теперь не могут быть использованы, потому что -regextype должен быть частью блока [expression] команды find:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

При использовании указанного псевдонима при попытке использовать символическую ссылку, параметры отладки и оптимизации выдается ошибка: find: unknown predicate '-<whatever>' как и при указании пути: find: paths must precede expression: <wherever> . Все эти опции являются необязательными, поэтому поиск все еще работает, но он более ограничен.

0

Другим вариантом является сценарий оберткой найти а - ля этого PERL скрипт сделал специально для установки -regextype

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

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