Как я могу использовать что-то похожее на cd -
, которое переходит в предыдущий каталог в истории, чтобы вернуться еще дальше в истории каталога? Например, предположим, что моя история: (1 — текущая.)
- ~/
- ~/другойКаталог
- ~/действительно/длинное/имя/каталога/которое/я/не/хочу/вводить/снова/но/не/использую/достаточно/для/создания/псевдонима/для
Использование cd -
здесь приведет меня к ~/otherDirectory
#2, и если я использую его снова, это приведет меня обратно к ~/
#1 (в котором я не хочу находиться), а не к очень длинному каталогу #3 (в котором я хочу находиться). Вкратце, как мне перейти дальше назад в историю каталогов? Есть ли какой-нибудь bash, который я мог бы написать, чтобы добавить эту функциональность?
Я пытаюсь вернуться назад по истории каталогов (более одного каталога), как если бы вы прошли по истории команд с помощью стрелки вверх. Надеюсь, это прояснит, что этот вопрос ранее не задавался.
решение1
Стек каталогов в Bash
Есть нечто, известное как стек каталогов или DIRSTACK
в bash. Стек — это базовая структура данных в информатике, где вы можете хранить элементы друг над другом (как стопка книг), но получать доступ только к самому последнему (верхнему).
Вот небольшая демонстрация — каждый раз, когда я помещаю что-либо в стек каталогов, мой текущий рабочий каталог устанавливается на этот элемент; каждый раз, когда я извлекаю — мы удаляем верхний (самый левый) элемент из стека и возвращаемся к следующему доступному элементу:
$> # pushd navigates to and stores the directory given
$> pwd
/home/xieerqi
$> pushd bin
~/bin ~
$> pushd /etc
/etc ~/bin ~
$> # popd deletes leftmost item, returns to next directory on left$> pwd
/etc
$> popd
~/bin ~
$> pwd
/home/xieerqi/bin
$>
Самый последний элемент всегда сохраняется наверху стека, даже если вы используетеcd
$> dirs
/ /etc ~
$> cd /var
$> dirs
/var /etc ~
$>
Команда dirs
позволяет нам извлечь n-ный элемент из стека. Используя этот вывод в качестве аргумента, cd
мы можем перейти к любому каталогу, который находится в стеке, не влияя на сам стек. Обратите внимание ниже, как /etc/
и ~
(элементы стека 1 и 2) остаются прежними, даже если я меняю свой текущий рабочий каталог (и верхний элемент тоже)
$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~
Использование поведения DIRSTACK для имитации поведения веб-браузера
Знаете ли вы, как в веб-браузере, если вы переходите с URL-адреса A на URL-адрес B и URL-адрес C, вы можете перемещаться между ними вперед и назад с помощью клавиш со стрелками «назад» и «вперед»?
То же самое мы можем сделать в bash с помощью этих двух функций:
cd()
{
if [ $# -eq 0 ]; then
pushd "$HOME" > /dev/null
else
pushd "$@" > /dev/null
fi
}
cdback()
{
popd > /dev/null
printf "Returned to:%s\n" "$( dirs +0)"
}
Функции имеют приоритет над псевдонимами, поэтому мы можем использовать это в своих интересах и выполнять каждый cd
вызов pushd
для каждого переданного аргумента (а если ничего не передано, мы возвращаемся в домашний каталог, то же самое поведение, но оно записывается).
$> pwd
/home/xieerqi
$> cd /etc
$> cd /var
$> cd /usr
$> pwd
/usr
$> cdback
Returned to:/var
$> pwd
/var
$> cd
$> pwd
/home/xieerqi
Стек каталогов в других оболочках
csh
имеет собственную реализацию стека каталогов, но ksh
не. Вы могли бы использовать Реализация Эдди
Переходим к циклу for
Что касается перехода на определенное количество каталогов вверх, вы можете написать функцию, которая вызывает cd ..
определенное количество раз. Например, вот моя пользовательская функция в.bashrc
function goUp # go up x number of dirs
{
num=$1
while [ num -ne 0 ];do
cd ..
num=$( expr $num - 1 )
done
}
# ---
Итак, я бы вызвал это, чтобы goUp 3
подняться на 3 каталога вверх, и это вызвало бы cd ..
3 раза
Использование номера инода
Этот метод хорош, когда Этот трюк часто используется, когда имя папки содержит сложные символы/неузнаваемые символы. Мы находим номер inode каталога, в который вы хотите перейти, используя, stat
а затем используем комбинацию find
иcd
$> stat $HOME/bin/sh/
File: ‘/home/xieerqi/bin/sh/’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 5795531 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ xieerqi) Gid: ( 1000/ xieerqi)
Access: 2015-08-19 15:27:38.280529273 -0600
Modify: 2016-02-20 17:03:49.822700405 -0700
Change: 2016-02-20 17:03:49.822700405 -0700
Birth: -
$> cd $(find $HOME -inum 5795531 -type d 2>/dev/null)
$> pwd
/home/xieerqi/bin/sh
Конечно, это может быть немного медленно, поскольку find
рекурсивно обходит все дерево каталогов.
решение2
Если вы перешли в ~/really/long/directory/name и хотите попасть только в ~/really/long, вы можете использовать , cd ~/really/long
даже если вы находитесь в подкаталоге 'long'
Если вы только что покинули ~/really/long и хотите вернуться туда, вы можете просто сделать
Cd
А затем используйте стрелку вверх, чтобы перейти по истории команд к тому месту, где вы их использовали.
Cd ~/really/long