Я должен изменить каталог на "нечто", когда это прибывает доступное. Как сделать это? Настолько далеко я имею, придумал:
cd `ls | grep foo`
Но проблема с этим состоит в том, что, если там не идет ни в какое сравнение с grep, каталог изменяется на корневой каталог.
Другой подход, который я имел, использовал:
ls -1 | grep foo | xargs -r cd
В этом примере-r заботится о не выполнении команды, если там не идет ни в какое сравнение. Но это не работает, так как команда CD является сборкой оболочки - в и не исполняемый файл. Или что-то как этот..
[редактирование] спасибо за ответы. Если возможно, Вы могли бы также сказать, как объединить упомянутую функциональность вокруг grep так или иначе, так, чтобы я мог использовать усовершенствованный regexp?
Это будет воздействовать только на каталоги и останется в том же каталоге, если ни один не будет найден:
cdg () {
cd $(ls -d */ | grep "$1" || echo .)
}
Если больше чем один каталог будет соответствовать, то он изменится в первое в списке.
Как насчет того, чтобы пробовать это?
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
}
//Отредактированный для соответствия обновленному вопросу.
if [[ -d foo ]]; then
cd foo
fi
-d
означает, что "файл существует и является каталогом". Это находится в разделе "CONDITIONAL EXPRESSIONS" удара человека.