Як використовувати команди pushd і popd?


332

Які практичні можливості використання обох pushdі popdколи є перевага використання цих двох команд над cdі cd -?

EDIT : Я шукаю кілька практичних прикладів використання обох цих команд або причин для збереження стека з каталогами (коли у вас є завершення вкладки cd -, псевдоніми для скорочення cd ..тощо).

Відповіді:


304

pushd, popdта dirsє вбудованими оболонками, які дозволяють маніпулювати стеком каталогів . Це можна використовувати для зміни каталогів, але повернення до каталогу, з якого ви прийшли.

Наприклад

запустити з таких каталогів:

$ ls
dir1  dir2  dir3

pushd до dir1

$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir

dirsкоманда підтверджує, що зараз у нас є 2 каталоги на стеці. dir1та оригінальний реж somedir.

натисніть на ../dir3 (тому що ми зараз всередині dir1)

$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3

dirsпоказує, що зараз у нас є 3 каталоги. dir3,, dir1і somedir. Помітьте напрямок. Кожен новий каталог додається зліва. Коли ми почнемо вимкнути каталоги, вони також з’являться зліва.

вручну змінити каталоги на ../dir2

$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir

Тепер почніть вискакувати каталоги

$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1

Зауважте, ми повернулися до dir1.

Знову поп ...

$ popd
~/somedir    
$ pwd
/home/saml/somedir

І ми туди , де ми почали, somedir.

Ви можете трохи заплутатись, але голова стека - це каталог, в якому ви зараз перебуваєте. Отже, коли ми повернемося до цього somedir, хоча dirsце показує:

$ dirs
~/somedir

Наш стек є фактично порожнім.

$ popd
bash: popd: directory stack empty

19
Дякую, я повністю розумію поняття стека і як ці команди працюють. Однак я шукаю кілька практичних причин для збереження стека з каталогами (коли у вас є заповнення вкладки cd -, псевдоніми для скорочення cd ..тощо).
синтагма

21
Я часто використовую pushd& popdв сценаріях, які не дозволяють мені запам'ятати, звідки я родом, я завжди можу просто popdповернутися звідки я приїхала. Я зазвичай це роблю, popd >/dev/null 2>&1щоб мовчати. Я використовую компакт-диск щодня в своїй оболонці. У цій статті є також інші поради щодо економії часу: thegeekstuff.com/2008/10/… .
slm

2
@Garrett - ніщо, що я можу уявити.
slm

4
@Garrett @slm, оскільки cd -відстежує лише останній каталог, я думаю, що можна буде мати проблеми, якщо ви викликаєте функцію, яка також внутрішньо змінює каталог. у такому випадку функція закінчиться скиданням - до поточного каталогу, а не до каталогу, до якого потрібно повернутися. pushd / popd - найбезпечніший метод. Примітка: я не перевіряв свою теорію.
Бінарний Філі

5
Чому б не повернутися до ~/somedir/dir3першого popd?
ziyuang

198

Існує дійсно корисний випадок використання pushdта popdкоманди для роботи з кількома папками одночасно.

Ви можете переміщатися по стеку дуже легко, оскільки він перерахований. Це означає, що ви можете мати кілька робочих папок у своєму розпорядженні під час роботи.

Дивіться простий приклад нижче.


Спочатку створимо приклад структури папок.

    user@vb:~$ mkdir navigate
    user@vb:~/navigate$ mkdir dir1
    user@vb:~/navigate$ mkdir dir2
    user@vb:~/navigate$ mkdir dir3

Потім ви можете додати всі свої папки до стеку:

    user@vb:~/navigate$ pushd dir1/
    ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir1$ pushd ../dir2/
    ~/navigate/dir2 ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir2$ pushd ../dir3/
    ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate

Ви можете переглянути його:

    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir2
     2  ~/navigate/dir1
     3  ~/navigate

Для безпечної навігації вам потрібно двічі додати останню (нульову) папку, оскільки вона завжди буде переписана:

    user@vb:~/navigate/dir3$ pushd .
    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

Тепер ви можете перестрибувати ці папки і працювати з стеком, як з псевдонімами для папок. Я думаю, наступна частина сама собою пояснює:

    user@vb:~/navigate/dir3$ cd ~4
    user@vb:~/navigate$ dirs -v
     0  ~/navigate
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate$ cd ~3
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate/dir1$ touch text.txt
    user@vb:~/navigate/dir1$ cp text.txt ~2
    user@vb:~/navigate/dir1$ ls ~2
    text.txt
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

Додатковим підказом є створення деяких псевдонімів для dirs -v.

Наприклад:

# In ~/.bashrc
alias dirs="dirs -v"

28
А ви можете очистити стек доdirs -c
Джун Муракамі

19
+1 за те, що насправді дає кілька практичних прикладів. Неважко зрозуміти, що робити pushd / popd зі сторінки man, але dirs та cd ~ # спочатку не очевидні.
Scribblemacher

Ви також можете використовувати таке рішення, як fasd, для цього робочого процесу, однак
WuTheFWasThat

так що краще для більш перехідного випадку використання, ніж встановлення CDPATH?
rfabbri

2
@Jun, є "mkdir dir {1,2,3}", щоб створити 3 каталоги в одному знімку.
Булат М.

39

Один простий випадок для використання стека dirs, що ви не можете зробити просто компакт-диском, це:

pushd .додає поточний каталог XX в dirsстек. Після цього ви можете пересуватися за допомогою cd, а повернутися до XX ви просто зробите popdнезалежно від того, наскільки «далеко» ви знаходитесь у дереві каталогів (можете переходити через кілька рівнів, набік тощо). Особливо корисний у сценаріях bash.


2
Я думаю, що це особливість, якою я користуюсь найчастіше. Оскільки pushd/ popdпрацюють незалежно від cd, ви можете використовувати їх як більш стабільну закладку, ніж cd -.
Гордон Бін

для мене це неправда. Кожен раз, коли я використовую CD, мій стек змінюється.
Харендра Сінгх

о, це було суто використання zsh, коли я
переходжу

4
Це єдина суттєва відповідь щодо порівняння з CD -, IMO. Що стосується того, чи "pushd foo"; <випадкова зміна режиму>; popd доцільніше, ніж a = foo; cd $ a; <випадкова зміна режиму>; cd $ a ... У сценаріях я бачу крихітну синтаксичну зручність у першому (pushd), але масове поліпшення чіткості в останньому ([явні] змінні!). Для інтерактивного сеансу, я думаю, я просто припускаю, що в першу чергу належним чином організована моя ієрархія каталогів, і якщо я загубився, просто cd ~ / назад / до / очевидний / шлях.
Ян Кю Пеблик

9

pushdі popdдозволяють вам маніпулювати каталогами на стеці.

Коли ви pushdстворюєте каталог, ви ставите поточний каталог у стек і змінюєте каталог на той, який вказаний у якості параметра.

popd дозволить вам повернутися до каталогу в стеці.

Якщо ви повторите, обхід каталогів буде схожим на збереження, і ви можете повернутися до збережених каталогів у зворотному порядку від того, в якому ви їх зберегли.


6

в основному для bash : замість використання cd можна використовувати pushdдля зміни директорій, з практичним використанням: історія відвідуваних каталогів зберігається (правильно: складено) і можна перемикатися між ними

pushd /home; pushd /var; pushd log

Щоб побачити використання стека dirsта простішу навігацію (щоб отримати номери "записів стека", використовуйте:

dirs -v

Вихід:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

Тепер використовуйте ці числа за допомогою cdта ~як:

cd ~1

Але ці цифри зараз переставляються, і позиція "0" зміниться, тож просто pushdкаталог у верхню позицію двічі (або використовуйте манекен на позицію 0) на зразок:

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

тепер 1..3 збереже позицію

(звільнити поточний каталог із стека / видалити його з використання історії popd)


5

Одне практичне використання, яке я знайшов, - перемикатися між каталогами за допомогою pushd та popd.

Припустимо, у нас є два каталоги dir1 і dir2, і мені потрібно постійно перемикатися між ними з якоїсь причини xyz.

В даний час я перебуваю в сомедірі, який має два каталоги dir1та dir2:

alcohol@alcohol-machine:~/somedir$ ls
dir1  dir2
alcohol@alcohol-machine:~/somedir$ 

Тепер переходжу до dir1

alcohol@alcohol-machine:~/somedir$ cd dir1
alcohol@alcohol-machine:~/somedir/dir1$ pwd
/home/alcohol/somedir/dir1

Тепер я додам dir1до стека та переключусь наdir2

alcohol@alcohol-machine:~/somedir/dir1$ pushd /home/alcohol/somedir/dir2
~/somedir/dir2 ~/somedir/dir1
alcohol@alcohol-machine:~/somedir/dir2$

Як бачите, зараз у мене dir2і dir1на стеці, і я зараз перебуваю dir2.

Тепер, щоб переключитися назад dir1, я побіжу pushd || popd.

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Voila, я в dir1 і у мене є dir1 і dir2 на стеці. Щоб знову перейти на dir2, запустітьpushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

Це простий спосіб перемикання між каталогами. Тепер ви можете, що знати, чому мені потрібно перемикатися між каталогами? Добре один випадок використання, коли я працюю над веб-додатком, я маю файл make в одному каталозі, а мої файли журналів - в іншому. Часто під час налагодження програми мені потрібно перемикатися між каталогами журналів, перевіряти останні журнали, а потім переходити назад до каталогу make, щоб внести деякі зміни та створити додаток.


11
(1) Питання задає питання: "Які переваги pushdі popdнад чим cd -?" Ви чітко не відповіли на це питання, оскільки ви точно описуєте, що cd -робить. (2) Який сенс говорити pushd || popd? Так, я знаю, що це cmdA || cmdBозначає запустити, cmdAа якщо не вдасться, то біжи cmdB. Я запитую, що корисного це робить у цьому контексті.  pushdбез аргументів означає "поміняти два верхні елементи на стеку каталогів"; він не вдається, якщо поточний каталог є єдиним елементом у стеці каталогів. У цьому випадку popdтеж не вдасться.
G-Man

3
Я не можу повірити, що ніхто вас не підтримав! Рятувальник! Який чудовий хак. Дякую. Перемикання, на мій погляд, в разі використання для pushdі popd.
Сонні

3
Є два чіткі способи, які вимагають набагато менше введення тексту, ніж pushd || popdдля перемикання між каталогами: pushdбез аргументів це робиться саме так. cd -явно існує виключно для повернення до останнього каталогу. Крім того, питання задає перевагу pushdнад cd -, в той час як ця відповідь, очевидно, не дає нічого, крім недоліків: більше набору тексту.
Бенджамін Ріггс

Якщо ми говоримо, без аргументів, то pushd обмінюється двома найпопулярнішими каталогами та повертає 0. Для чого потрібен || popdперемикач? Будь ласка, поясніть. (Чи не достатньо просто?)
Джонні Вонг,

@Sonny Просто використовуйте cd -для перемикання між двома каталогами. Крім того, cdбез аргументів повертається до домашнього каталогу.
Стів

2

Простіше кажучи - коли вам потрібно переходити між більш ніж двома каталогами, як правило, кілька разів вперед і назад, так як cd -просто не буде обрізати його нічим, крім двох папок.

Наприклад, замість того, щоб намагатися знову придумувати попередні довгі шляхи, переглядаючи історію буфера або вкладку, завершивши довгий шлях, ви просто складіть важливі вгору і, якщо потрібно, зручно перейти до них лише за їх кількістю. Обертання між складними структурами каталогів і довгими шляхами стає гладким і швидким.

Вбудовані також дозволяють переупорядкувати стек або випустити каталоги, які вам більше не потрібні, що забезпечує гнучкість у вашому робочому процесі.

Складання каталогів також може використовуватися в сценаріях аналогічно для операцій, що охоплюють кілька каталогів.


1

Я вважав, що використання dirs / popd / pushd трохи незручно. Я придумав своє особисте рішення в tcsh, додавши наступний код у .alias

  foreach b (. , - 0 1 2 3 4 5 6 7 8 9 )
    alias p$b       'set a=`pwd`; echo $a >! ~/.mydir'$b
    alias cd$b      'cd "`cat ~/.mydir'$b'`"'
    alias del$b     'rm -v ~/.mydir'$b
    alias home$b    'set a="~"; echo $a >! ~/.mydir'$b
  end
    alias cdl       'grep / ~/.mydir*'

таким чином я відчув, наприклад, "p". щоб зберегти поточний робочий dir у файл ~ / .mydir. та "cd." щоб відновити цей директор, коли і де мені подобається. "дель." видаляє відповідний файл; "додому". встановлює dir на домашній dir (еквівалент cd; p.); "cdl" перераховує, що є збереженими dirs. Зауважте, що якщо ви використовуєте ~ / Dropbox / .mydir $ b (або будь-яку іншу хмарну службу, наприклад, ownCloud) замість ~ / .mydir $ b, ви отримаєте розумний спосіб використовувати бажані папери для різних облікових записів та машин.


0

Я використовую його так у моєму файлі bash_profile та .bashrc

vi .bash_profile
alias dirs="dirs -v"
source d.sh
:wq

vi .bashrc
alias dirs="dirs -v"
:wq

vi d.sh
pushd ~/Documents/GIT/seiso-data
pushd ~/Documents/GIT/ewe/EosRegistry
pushd ~/Documents/GIT_LODGING/site-cookbooks
pushd ~/Documents/CHEF_LODGING
pushd  .
:wq

це допомагає мені переходити між каталогами до останніх використовуваних на моєму терміналі. :-) Сподіваюся, це допоможе вам використовувати pushd, а не popd, я використовую cd ~ stackednumber


0

Використання cdта cd -дозволяє перемикатися між двома останніми використаними каталогами. Розмір вашого "каталогу робочого каталогу" - два.

Використовуючи pushd, ви можете зберігати довільно велику кількість каталогів у своєму робочому наборі.

pushdБільшу частину часу я використовую , ніж cd. Після того, як ви створили стек активних каталогів pushd directory_name, ви можете переходити між ними цілий день pushd ~#.

pushd dir1
pushd ../dir2
pushd /full/path/to/dir3

# There are now three directories in the stack.

pushd ~3
pushd ~2

# The same three directories are still on the stack, 
# just in a different order.

Я використовую popdрідко, лише тоді, коли я хочу видалити каталог зі стека, коли я знаю, що закінчую цей каталог.

Перейдіть до каталогу та вийміть його зі стека:

popd ~2

Залишайтеся в поточному каталозі та видаліть інший каталог зі стека:

popd +2

У вас є стиль роботи, схожий на відкриття декількох вікон або вкладок терміналів (по одному для кожного каталогу, в якому ви активно працюєте), але все в одному терміналі. Це економить нерухомість на екрані, плюс, оскільки всі шляхи до каталогу доступні в одній оболонці, ви можете робити такі речі:

  • копіюйте файли між каталогами, з якими ви зараз працюєте
  • переглядати або редагувати файли в іншому каталозі, не заходячи туди

Приклади:

cp ~2/myfile.txt ~4
less ~2/myfile.txt

У tcsh(але ні bash) ви навіть можете зберегти стек свого каталогу у файл та відновити його пізніше.

Зберегти:

dirs -S ~/dirstack

Відновлення:

dirs -L ~/dirstack

В іншому випадку просто замініть ~в bashприкладах на =для використання в tcsh.

pushd =2
popd =4
popd +1

0

"Pushd / popd" - це така проста концепція, яка потребує певного розуміння, оскільки люди, як правило, навчають її, визначаючи ці команди як команди, що "маніпулюють стеком каталогів", що, на мою думку, бентежить.

Я дивлюся на це по-іншому:

pushd [папка_файлу] - перейде до [папки_файли] і задокументує призначення, яке є [ім'я_папки] у стеку dir, тоді як верхній каталог у стеці завжди буде поточним dir, в якому ви знаходитесь

popd - спочатку введе вас у запис каталогу, який знаходиться на вершині стека, та видалить його зі стека

dirs - надрукує стек dir (можна трактувати як dir Db, де крайній лівий запис - поточний каталог (у верхній частині стека)

Тож два найпопулярніші випадки використання:

Використовуйте випадок 1: Навігація за допомогою pushd та popd

root@mypc:/main/$ ls
dir1  dir2  dir3  dir4

root@mypc:/main/$ dirs   # prints the current stack
/main

root@mypc:/main/$ pushd dir1    # Will cd to dir1 and document dir1 in dir stack, stack is now:
/main/dir1 /main 
root@mypc:/main/dir1$    # I am now in /main/dir1

root@mypc:/main/dir1$    # Now let's go wild and document whatever I want
root@mypc:/main/dir1$ pushd ../dir2 
root@mypc:/main/dir2$     # Woo I am in /main/dir2
root@mypc:/main/dir2$ pushd ../dir3 
root@mypc:/main/dir3$     # Woo I am in /main/dir3
root@mypc:/main/dir3$ pushd ../dir4 
root@mypc:/main/dir4$     # Woo I am in /main/dir4
root@mypc:/main/dir4$ dirs   # Now dir stack is:
/main/dir4 /main/dir3 /main/dir2 /main/dir1 /main

Скажімо, я зробив вищезазначене, оскільки хотів би повернутися до тих папок, які я задокументував!

Зауважте, що якщо я вручну CD, я вплину на верхній запис стека dir (який завжди є поточним dir)

root@mypc:/main/dir4$ cd ..   # Now dir stack is:
# (note that /main appear in the leftmost as well which is the top of the stack)
/main /main/dir3 /main/dir2 /main/dir1 /main
root@mypc:/main$ 

Давайте перейдемо назад:

root@mypc:/main$ popd
root@mypc:/main$     # Still in /main since it was at the top of the dir stack
root@mypc:/main$ dirs    # Stack is now:
/main/dir3 /main/dir2 /main/dir1 /main

root@mypc:/main$ popd
root@mypc:/main/dir3$ popd    # Woo in dir3 now, about to navigate to dir2
root@mypc:/main/dir2$ popd    # Woo in dir2, about to navigate to dir1
root@mypc:/main/dir1$ dirs    # Stack is now:
/main

Знову я можу задокументувати будь-який редактор, який я хочу, а потім перейти вручну до іншого dir, то я зможу легко повернутися до документально задокументованого dir, який я вставив у стек.

Використовуйте випадок 2: Навігація за допомогою числового індексу стека

Скажімо, я натиснув, використовуючи pushd dir4 dir3 dir2 dir1, тепер запущений dir -v покаже:

root@mypc:/main$ dirs -v
 0  /main/dir1  (this is the current dir you are in always)
 1  /main/dir2
 2  /main/dir3
 3  /main/dir4

Тепер ви можете виконувати будь-яку операцію Linux, яка включає каталоги, використовуючи індекс стека:

root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt    # this will run in the background, something like:
# cp /main/dir2/temp.txt  /main/dir3/new_temp.txt

Ви навіть можете видалити певний запис із стека dir:

root@mypc:/main$ popd ~4

Сподіваємось, що використання слів "документування" або продумати стек dir як якийсь Db спрощує концепцію!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.