
Например, я в своем каталоге:
/home/myname
а затем я хочу перейти в другой каталог.
/home/pulsar/...
Поскольку мне нужно зайти довольно глубоко в другой каталог, как я могу это сделать, не печатая всю строку? Я пробовал
cd */thedirectoryiwanttogointo
но это не работает. Мне приходится вводить всю строку.
решение1
Вероятно, ваш подстановочный знак не работает по следующим причинам:
- не было совпадений для подстановочного знака из указанного вами местоположения, или
- было больше одного совпадения.
Обычный подход (в оболочке) для частого перемещения между подкаталогами заключается в использовании функции CDPATH
, а также pushd
и popd
.
Эта CDPATH
функция (возможно, впервые появившаяся в tcsh) представляет собой список каталогов, разделенных двоеточием. Если родитель вашего thedirectoryiwanttogointo
имени достаточно уникален, то вы можете добавить родителя в список.
Для дальнейшего чтения (страница руководства вашей оболочки должна быть первой):
- Что такое CDPATH?
- 3.4. Изменение каталогов с помощью
cd
(Пошаговое руководство по Red Hat Enterprise Linux) - Как изменить CDPATH для оболочек C: csh и tcsh
pushd
и popd
новее, чем CDPATH
, но все еще датируются серединой 1990-х. Они позволяют вам сохранять текущий каталог («заталкивая» в стек) и восстанавливать его («выталкивая» из стека) во время соответствующих им cd
команд. Для дальнейшего чтения:
Другие используют псевдонимы оболочки или символические ссылки. Они наиболее полезны при переходе в известные места.
решение2
Предполагая, что все возможные целевые каталоги указаны ниже /home
и в именах каталогов нет символов новой строки, вы можете использовать следующую функцию оболочки:
cds() {
cd "$(find /home -type d -name "$1" | head -n 1)"
}
$ cds thedirectoryiwanttogointo
Конечно, в зависимости от того, сколько подкаталогов и файлов находится в папке /home
, а также от способности вашей ОС кэшировать все дерево в памяти или нет, производительность будет существенно различаться.
В системах GNU вы можете ускорить его и сделать более надежным в отношении символов новой строки в именах файлов, используя вместо этого следующий синтаксис:
cds() {
cd "$(find /home -type d -name "$1" -print -quit)"
}
Поиск будет остановлен, как только будет найдено первое совпадение.
Обратите внимание, что аргумент рассматривается как шаблон, поэтому вы можете сделать следующее:
cds 'foo*bar'
например, cd
в первый каталог (порядок не указан), имя которого начинается с foo
и заканчивается на bar
.
решение3
Вы хотите, чтобы расширение wildcard находило путь в любом месте системы. Вы можете сделать это, если правильно укажете шаблон:
cd /**/thedirectoryiwanttogointo
будет работать в zsh и fish по умолчанию,в Bash если вы сначалаshopt -s globstar
, вткш если выset globstar
, в ksh93 если вы set -o globstar
, в yash
если вы set -o extended-glob
.
Это работает, поскольку подстановочный знак используется в абсолютном пути, начинающемся с , /
а не относительно текущего каталога, и когда вы выбираете использование шаблона, **
он расширяется до любого количества подкаталогов.
Хотя это и будет работать,это, вероятно, займет очень много времени. Ваша оболочка должна выполнить поиск по всей системе для соответствующих файлов. Вы можете сократить это, указав более длинный префикс, чтобы сократить больше пространства поиска:
cd /home/pulsar/**/thedirectoryiwanttogointo/
Чем глубже вы углубляетесь, тем меньше будет поисков. Если дерево каталогов довольно разреженное, это не займет много времени и на самом деле практично в использовании. Завершающий элемент /
гарантирует, что расширение будет только в каталоге, что устраняет одну из разновидностей двусмысленности, которая может возникнуть.
Если совпадений все еще больше, результат будет зависеть от вашей оболочки. Bash и fish перейдут к первому совпадению по алфавиту, игнорируя неоднозначность. tcsh и yash сообщат об ошибке. zsh и ksh интерпретируют это как попытку использовать одну из своих расширенных функций переключения каталогов ивероятносообщить об ошибке.
Если вы, вероятно, будете использовать один и тот же каталог неоднократно, либо укажите родительскийвCDPATH
или создание переменной оболочки, $FOO
которую вы можете использовать вместо длинного пути, является лучшим вариантом. Вы можете объединить переменную оболочки с **
расширением, чтобы сэкономить больше ввода, если вы используете его часто.
решение4
Если вы всегда переходите в один и тот же глубокий каталог, одним из простых решений будет создание символической ссылки на него:
ln -s ~/foo/bar/baz/quux/etc/etc/etc/target ~/shortcut
Если вы уже заходили в этот каталог, другое решение — поискать в истории команд нужное вам имя; нажмите ctrl-R и символы для поиска. Это специфично для bash, но я думаю, что большинство современных оболочек имеют похожую возможность.