Изменение пути условно на bash

1

Я должен изменить каталог на «foo», когда он станет доступным. Как это сделать? Это далеко я придумал:

cd `ls | grep foo`

Но проблема в том, что если нет совпадения для grep, каталог меняется на домашний каталог.

Я использовал другой подход:

ls -1 | grep foo | xargs -r cd

В этом примере -r заботится о том, чтобы команда не выполнялась, если совпадений нет. Но это не работает, поскольку команда cd является встроенной оболочкой, а не исполняемым файлом. Или что-то типа того..

[править] Спасибо за ответы. Если возможно, не могли бы вы также сказать, как каким-то образом объединить упомянутую функциональность с grep, чтобы я мог использовать расширенное регулярное выражение?

user40167
источник

Ответы:

1

Это будет работать только для каталогов и останется в том же каталоге, если ни один не найден:

cdg () {
    cd $(ls -d */ | grep "$1" || echo .)
}

Если более одного каталога совпадает, он станет первым в списке.

Деннис Уильямсон
источник
3

Как насчет того, чтобы попробовать это?

test -d foo && cd foo

Затем вы можете поместить это как функцию в ваш .bashrc или что-то в этом роде:

# conditional cd, use as follows:
# ccd some_dir
function ccd {
    test -d "$1" && cd "$1"
}

Чтобы использовать grep вместо простого теста -d, используйте следующее (обратите внимание, что вы можете использовать другой grep или добавлять флаги по своему желанию):

# conditional regex-cd
functino rccd {
    if has_dir=`ls |egrep "$1"`; then cd $has_dir; fi
}

// Отредактировано в соответствии с обновленным вопросом.

Дейв Фогт
источник
2
if [[ -d foo ]]; then
  cd foo
fi

-dозначает «файл существует и является каталогом». Это в разделе "УСЛОВНЫЕ ВЫРАЖЕНИЯ" man bash.

Мэтью Флэшен
источник