Существует ли ярлык Bash для того, чтобы пересечь подобные структуры каталогов?

SELECT * FROM table WHERE field1 NOT LIKE '%$x%'; (Удостоверяются, что Вы выходите из $x правильно заранее для предотвращения Внедрения SQL)

Редактирование: NOT IN делает что-то немного различное - Ваш вопрос не полностью ясен так выбор который использовать. LIKE 'xxx%' может использовать индекс. LIKE '%xxx' или LIKE '%xxx%' не может.

5
задан javaPlease42 6 January 2014 в 22:17
поделиться

3 ответа

Другие предлагаемые до сих пор решения страдают от одной или нескольких из следующих проблем:

  • Архаичные формы тестов - как указал Михал Горни
  • Неполная защита от имен каталогов содержащие пробелы
  • Неспособность обработать структуры каталогов, которые имеют одно и то же имя, используемое более одного раза, или с соответствующими подстроками: / canis / lupus / lupus / или / nicknames / Robert / Rob /

Эта версия решает все проблемы, перечисленные выше.

cd () 
{ 
    local pwd="${PWD}/"; # we need a slash at the end so we can check for it, too
    if [[ "$1" == "-e" ]]
    then
        shift
        # start from the end
        [[ "$2" ]] && builtin cd "${pwd%/$1/*}/${2:-$1}/${pwd##*/$1/}" || builtin cd "$@"
    else
        # start from the beginning
        [[ "$2" ]] &&  builtin cd "${pwd/\/$1\///$2/}" || builtin cd "$@"
    fi
}

Выдача любой из других версий, которую я назову cdX , из такого каталога, как этот:

    /canis/lupus/lupus/specimen $ cdX lupus familiaris
    bash: cd: /canis/familiaris/lupus/specimen: No such file or directory

не удается, если вторая пример «волчанки» - это тот, который предназначен. Чтобы учесть это, вы можете использовать опцию « -e », чтобы начать с конца структуры каталогов.

    /canis/lupus/lupus/specimen $ cd -e lupus familiaris
    /canis/lupus/familiaris/specimen $

Или выдача одного из них из этого:

    /nicknames/Robert/Rob $ cdX Rob Bob
    bash: cd: /nicknames/Bobert/Rob: No such file or directory

непреднамеренно заменит часть строки. Моя функция обрабатывает это, включая косые черты в совпадение.

    /nicknames/Robert/Rob $ cd Rob Bob
    /nicknames/Robert/Bob $

Вы также можете указать каталог однозначно следующим образом:

    /fish/fish/fins $ cd fish/fins robot/fins
    /fish/robot/fins $

Кстати, я использовал управляющие операторы && и || в моей функции вместо if ... then ... else ... fi только ради разнообразие.

5
ответ дан 13 December 2019 в 22:12
поделиться
cd "${PWD/sweet/andy}"
3
ответ дан 13 December 2019 в 22:12
поделиться

Нет, но ...

Подстановочное выражение Михала Горни прекрасно работает. Чтобы переопределить встроенную команду cd, сделайте следующее:

cd () {
  if [ "x$2" != x ]; then
    builtin cd ${PWD/$1/$2}
  else
    builtin cd "$@"
  fi
}
2
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

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