Как я могу использовать что-то подобное cd -
, которое переходит к предыдущему каталогу в истории, чтобы вернуться еще дальше в историю каталогов? Например, допустим, моя история такова: (1 - текущая. )
Использование cd -
здесь приведет меня к ~/otherDirectory
#2, и если я использую его снова, то он вернет меня в ~/
#1 (в котором я не хочу быть), а не в очень длинный каталог #3 (в котором я хочу быть). В общем, как мне перейти дальше назад в историю каталогов? Есть ли какой-нибудь bash, который я мог бы написать, чтобы добавить эту функциональность?
Я пытаюсь вернуться назад по истории каталогов (более одного каталога), подобно тому, как можно вернуться по истории команд, используя стрелку вверх. Надеюсь, это прояснит, что этот вопрос не был задан ранее.
Стопка каталога в 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
пересекает целое дерево каталогов рекурсивно.
Если Вы - cd'd в ~/really/long/directory/name, и Вы хотите быть в просто ~/really/long, можно использовать cd ~/really/long
, даже если Вы находитесь в подкаталоге 'длинных'
, Если Вы только что оставили ~/really/long, и Вы хотите возвратиться туда, можно просто сделать
Cd
И затем использовать стрелку вверх для к через историю команд туда, где Вы использовали
Cd ~/really/long