cd - дальше в историю

cd - дальше в историю

Как я могу использовать что-то похожее на cd -, которое переходит в предыдущий каталог в истории, чтобы вернуться еще дальше в истории каталога? Например, предположим, что моя история: (1 — текущая.)

  1. ~/
  2. ~/другойКаталог
  3. ~/действительно/длинное/имя/каталога/которое/я/не/хочу/вводить/снова/но/не/использую/достаточно/для/создания/псевдонима/для

Использование 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

Связанный контент