- Use ‘pushd’ and ‘popd’ for Efficient Filesystem Navigation in Linux
- How pushd and popd Commands Work in Linux
- push/pop current directory?
- 5 Answers 5
- Команды pushd и popd
- Команда pushd
- Быстрый переход к произвольной директории в стеке
- Команда popd
- Еще пара трюков
- Удалить из стека
- Переключение туда и обратно
- Заключение
- Команды Pushd и Popd в Linux
- Стек каталогов
- Команда pushd
- Команда popd
- Заключение
Use ‘pushd’ and ‘popd’ for Efficient Filesystem Navigation in Linux
Sometimes it can be painful to navigate the Linux file system with commands, especially for the newbies. Normally, we primarily use the cd (Change Directory) command for moving around the Linux file system.
In a previous article, we reviewed a simple yet helpful CLI utility for Linux called bd – for quickly moving back into a parent directory without typing cd ../../.. repeatedly.
This tutorial will explain a related set of commands: “pushd” and “popd” which are used for efficient navigation of the Linux directory structure. They exist in most shells such as bash, tcsh etc.
How pushd and popd Commands Work in Linux
pushd and popd work according to the “LIFO” (last in, first out) principle. In this principle, only two operations are allowed: push an item into the stack, and pop an item out of the stack.
pushd adds a directory to the top of the stack and popd removes a directory from the top of the stack.
To display directories in the directory stack (or history), we can use the dirs command as shown.
pushd command – puts/adds directory paths onto a directory stack (history) and later allowing you to navigate back to any directory in history. While you add directories to the stack, it also echoes what’s existing in history (or “stack”).
The commands show how pushd works:
$ pushd /var/www/html/ $ pushd ~/Documents/ $ pushd ~/Desktop/ $ pushd /var/log/
From directory stack in the output above (directory index is in reverse order):
- /var/log is the fifth [index 0] in the directory stack.
- ~/Desktop/ is fourth [index 1].
- ~/Documents/ is third [index 2].
- /var/www/html/ is second [index 3] and
- ~ is first [index 4].
Optionally, we can use the directory index in the form pushd +# or pushd -# to add directories to the stack. To move into ~/Documents, we would type:
Note after this, the stack content will change. So from the previous example, to move into /var/www/html, we would use:
popd command – removes a directory from the top of the stack or history. To list the directory stack, type:
To remove a directory from the directory stack inded use popd +# or popd -# , in this case, we would type the command below to remove ~/Documents:
In this tutorial we explained “pushd” and “popd” commands which are used for efficient navigation of the directory structure. Share your thoughts concerning this article via the feedback form below.
push/pop current directory?
With bash is there a way to push and pop the current working directory? I tried writing bash;cd dir; ./dostuff;exit; but the current directory is now dir .
5 Answers 5
Bash will keep a history of the directories you visit, you just have to ask. Bash stores the history in a stack and uses the commands pushd and popd to manage the stack.
$ pwd; pushd /tmp; pwd; popd; pwd /home/me /tmp ~ /tmp ~ /home/me
Excerpt from the link pushd Saves the current directory on the top of the directory stack and then cd to dir. With no arguments, pushd exchanges the top two directories.
Calling bash starts a new subshell, which has its own input; none of the other commands will run until it exits. Surrounding the commands to be run with parens will also start a new subshell, but it will run the commands within it.
Brilliant! No need to push/pop when the intention is to just run a command in a different directory (e.g. update a dependency) then come back to the current one.
If you don’t need multiple levels of directory history, you can also do:
cd foo # do your stuff in foo cd -
Compared to pushd / popd , this has the disadvantage that if cd foo fails, you end up in the wrong directory with cd — .
(Probably cd — is more handy outside scripts. «Let’s go back where I just was.»)
UPD. found, yes, compatible, this is actually cd «$OLDPWD» && pwd . unix.com/man-page/posix/1posix/cd
I use alias for keeping track of my directory changes so to ‘cd’ somewhere I can just go back to where I was using ‘cd.’, or go back two using ‘cd..’, etc.;
alias pushdd="pushd \$PWD > /dev/null" alias cd='pushdd;cd' alias ssh='ssh -A' alias soc='source ~/.bashrc' #below to go back to a previous directory (or more) alias popdd='popd >/dev/null' alias cd.='popdd' alias cd..='popdd;popdd' alias cd. ='popdd;popdd;popdd' alias cd. ='popdd;popdd;popdd;popdd' #below to remove directories from the stack only (do not 'cd' anywhere) alias .cd='popd -n +0' alias ..cd='popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0'
Команды pushd и popd
При работе в командной строке Linux для перехода в другую директорию используется команда cd .
Для вывода текущей рабочей директории используется команда pwd .
Команда pushd
Когда требуется работа с несколькими директориями, то использование только cd может быть не очень удобно. Здесь приходит на помощь команда pushd
Команда pushd создает стек директорий (папок).
Стек это просто список (ну почти). Команда pushd создает список папок (список путей). Стек обладает таким свойством, что то, что в него помещается последним, должно его первым и покинуть. Его можно сравнить со стаканом, в который мы кладем кружочки. Кружочек, который положили последним (он на вершине стека), должен первым покинуть стакан, чтобы получить доступ к следующему кружочку. Также и в стеке.
Чтобы добавить произвольную директорию в стек (и сразу же в нее перейти), то нужно дополнительно указать путь до этой директории (символ тильда ~ в путях в Linux означает домашнюю директорию пользователя):
После выполнения команды, через пробел выводятся директории, находящиеся в стеке.
$ pushd ~/MyData ~/MyData ~/Downloads ~
Важное замечание: На вершине стека всегда размещена текущая директория. То есть, даже если вы не добавляли никаких директорий в стек, то в нем все равно будет содержаться текущая рабочая директория.
Для более удобного просмотра стека можно использовать команду dirs -v
$ dirs -v 0 ~/MyData 1 ~/Downloads 2 ~
Быстрый переход к произвольной директории в стеке
Как видно из вывода команды dirs -v , все папки в стеке пронумерованы. Эти номера можно использовать для быстрого перехода к соответствующей директории.
Перейдем к директории с индексом 2:
Команда popd
Пользователь всегда находится в той директории, которая в текущей момент расположена на вершине стека.
Чтобы извлечь директорию с вершины стека и перейти в директорию, которая окажется следующей (станет вершиной стека), используется команда popd
# Стек пустой (в нем только текущая директория) $ dirs -v 0 ~ # Помещаем в стек директории dir1, dir2, dir3 $ pushd ~/dir1 ~/dir1 ~ $ pushd ~/dir2 ~/dir2 ~/dir1 ~ $ pushd ~/dir3 ~/dir3 ~/dir2 ~/dir1 ~ # Стек выглядит следующим образом $ dirs -v 0 ~/dir3 1 ~/dir2 2 ~/dir1 3 ~ # Извлекаем директорию dir3 из стека # и попадаем в директорию dir2 (она стала вершиной) $ popd ~/dir2 ~/dir1 ~ # Извлекаем dir2, попадаем в dir1 $ popd ~/dir1 ~ # Извлекаем dir1, попадаем в ~ $ popd ~
Еще пара трюков
Удалить из стека
Чтобы удалить директорию из стека (сама директория, конечно, не удаляется) используется следующая команда. Вместо 3 укажите индекс директории, которую нужно убрать из стека.
Переключение туда и обратно
Если выполнять команду pushd без параметров, то можно переключаться между двумя верхними директориями в стеке. Происходит переключение туда и обратно между верхними директориями, остальная часть стека не меняется.
Примечание: Состояние стека хранится только в рамках текущей сессии терминала.
Заключение
Команды pushd , popd и cd помогают для быстрой навигации по директориям.
Мы рассмотрели базовые возможности команд pushd и popd . Дополнительную информацию по их использованию можно получить, выполнив:
Команды Pushd и Popd в Linux
Добавить в избранное
p ushd и popd это команды, которые позволяют вам работать со стеком каталогов и изменять текущий рабочий каталог в Linux и других Unix-подобных операционных системах. Хотя pushd и popd являются очень мощными и полезными командами, они недооценены и используются редко.
В этой статье мы покажем вам, как использовать команды pushd и popd для перемещения дерева каталогов вашей системы.
Стек каталогов
Стек каталогов представляет собой список каталогов, к которым вы ранее обращались. Содержимое стека каталогов можно увидеть с помощью команды dirs. Каталоги добавляются в стек при переходе в каталог с помощью команды pushd и удаляются с помощью команды popd.
Текущий рабочий каталог всегда находится на вершине стека каталогов. Текущий рабочий каталог является каталогом (папка), в котором в настоящее время работает пользователь. Каждый раз, когда вы взаимодействуете с командной строкой, вы работаете в директории.
Команда pwd позволяет узнать, в каком каталоге вы сейчас находитесь.
При навигации по файловой системе используйте клавишу Tab для автозаполнения имен каталогов. Добавление косой черты в конце имени каталога не является обязательным.
pushd и popd, являются встроенными функциями оболочки, и его поведение может слегка отличаться от оболочки к оболочке. Мы рассмотрим встроенную версию команд Bash.
Команда pushd
Синтаксис pushdкоманды следующий:
Например, чтобы сохранить текущий каталог в верхней части стека каталогов и перейти к нему /var/www, введите:
В случае успеха указанная выше команда напечатает стек каталогов. ~каталог, в котором мы выполнили команду pushd. Символ тильды ~ означает домашний каталог.
pushd сначала сохраняет текущий рабочий каталог в верхнюю часть стека, а затем переходит к указанному каталогу. Поскольку текущий каталог всегда должен быть на вершине стека, после изменения новый текущий каталог попадает на вершину стека, но не сохраняется в стеке. Чтобы сохранить его, вы должны вызвать pushd. Если вы используете cd для перехода в другой каталог, верхний элемент стека будет потерян.
Давайте добавим еще один каталог в стек:
Чтобы отменить изменение по умолчанию для каталога, используйте параметр -n. Например, чтобы добавить каталог /usr/local в стек, но не переходить в него, введите:
Поскольку текущий каталог (который всегда находится вверху) не изменяется, каталог /usr/local добавляется вторым от вершины стека:
pushd принимает два варианта, +N и -N, что позволяет перемещаться в Nth директории стека. Параметр +N изменяется на Nth элемент списка стека подсчета слева направо, начиная с нуля. Когда как -N используется направление счета справа налево.
Чтобы лучше проиллюстрировать параметры, давайте напечатаем текущий стек каталогов:
Вывод покажет индексированный список стека каталогов:
0 /opt 1 /usr/local 2 /var/www 3 /home/linuxize
Если вы хотите перейти в каталог /var/www и поместить его на вершину стека, вы будете использовать один из следующих.
При подсчете сверху вниз (или слева направо) индекс каталога равен 2.
При подсчете снизу вверх индекс каталога /var/www равен 1.
При использовании без каких-либо аргументов pushd переключает две верхние директории и делает новую вершину текущей. Это то же самое, что и при использовании команды cd.
Команда popd
Команда popd принимает форму:
При использовании без аргументов popd удаляет верхний каталог из стека и переходит в новый верхний каталог.
Допустим, у нас есть следующий стек каталогов:
/opt /usr/local /var/www /etc/nginx ~
Если вы запустите popdкоманду, она удалит /opt из стека и перейдет в каталог /usr/local:
Вывод покажет новый стек каталогов:
Опция -n подавляет изменение каталога по умолчанию и удаляет второй элемент из стека:
Также как pushd, popd также принимает параметры +N и -N, которые можно использовать для удаления каталога Nth из стека.
Заключение
Обычно вы используете команду cd для перемещения из одного каталога в другой. Однако, если вы проводите много времени в командной строке, команды pushd и popd повысят вашу производительность и эффективность.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.