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

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

  1. ~/
  2. ~/otherDirectory
  3. ~/really/long/directory/name/that/i/don't/want/to/type/again/but/dont/use/enough/to/make/an/alias/for

Использование cd - здесь приведет меня к ~/otherDirectory#2, и если я использую его снова, то он вернет меня в ~/#1 (в котором я не хочу быть), а не в очень длинный каталог #3 (в котором я хочу быть). В общем, как мне перейти дальше назад в историю каталогов? Есть ли какой-нибудь bash, который я мог бы написать, чтобы добавить эту функциональность?

Я пытаюсь вернуться назад по истории каталогов (более одного каталога), подобно тому, как можно вернуться по истории команд, используя стрелку вверх. Надеюсь, это прояснит, что этот вопрос не был задан ранее.

1
задан 12 October 2017 в 08:10

2 ответа

Стопка каталога в Bash

Существует что-то, знают как стопка каталога или DIRSTACK в ударе. Стек является структурой основных данных в информатике, где можно сохранить элементы друг на друге (как книжная стопка), но доступ, только новый один (вершина).

Вот маленькая демонстрация - каждый раз, когда я продвигаю что-то на стопке каталога, мой текущий рабочий каталог установлен на тот объект; каждый раз я появляюсь - мы удаляем главный (крайний левый) объект из стека и возвращаемся к следующему доступному объекту:

$>  # 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 команда позволяет нам получать энный элемент от стека. Используя тот вывод как аргумент cd мы можем перейти к любому каталогу, который находится на стеке, не влияя на сам стек. Заметьте рев как /etc/ и ~ (элементы стека 1 и 2), остаются такими же, даже при том, что я изменяю свой текущий рабочий каталог (и вершина также)

$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~

Используя поведение DIRSTACK для моделирования поведения веб-браузера

Вы знаете, как в веб-браузере, если Вы спрыгиваете с URL к URL B и URL C, можно отчасти пойти назад и вперед между ними использующий назад и передними клавишами со стрелками?

Ну, мы можем сделать то же в ударе с этими двумя функциями:

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

Стек Directory в других оболочках

csh имеет его собственную реализацию стопки каталога, но ksh не делает. Вы могли использовать реализацию Eddie

Восстановление работоспособности с для цикла

Что касается движения определенного числа директоров, Вы могли записать функцию, которая звонит 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 число Этот метод хорош, когда Этот прием часто используется, когда имя папки имеет трудный символьный/неузнаваемый символ. Мы находим 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 пересекает целое дерево каталогов рекурсивно.

3
ответ дан 7 December 2019 в 12:41

Если Вы - cd'd в ~/really/long/directory/name, и Вы хотите быть в просто ~/really/long, можно использовать cd ~/really/long, даже если Вы находитесь в подкаталоге 'длинных'

, Если Вы только что оставили ~/really/long, и Вы хотите возвратиться туда, можно просто сделать

Cd

И затем использовать стрелку вверх для к через историю команд туда, где Вы использовали

Cd ~/really/long
0
ответ дан 7 December 2019 в 12:41

Другие вопросы по тегам:

Похожие вопросы: