1

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

cd `ls | grep foo`

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

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

ls -1 | grep foo | xargs -r cd

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

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

3 ответа3

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.

1

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

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

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

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