Змінюючи шлях умовно на bash


1

Я повинен змінити каталог на "foo", коли він стане доступним. Як це зробити? Поки що я придумав:

cd `ls | grep foo`

Але проблема в тому, що якщо немає відповідності grep, каталог змінюється на домашній каталог.

Іншим підходом я користувався:

ls -1 | grep foo | xargs -r cd

У цьому прикладі -r дбає про те, щоб не запустити команду, якщо немає відповідності. Але вона не працює, оскільки команда cd - це вбудована оболонка, а не виконується. Або щось подібне ..

[редагувати] Дякую за відповіді. Якщо можливо, ви можете також сказати, як якось поєднати згадану функціональність навколо grep, щоб я міг використовувати розширений regexp?

Відповіді:


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, використовуйте наступне (зауважте, що ви можете використовувати інший греп або додати прапорці за своїм бажанням):

# 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.