はじめに
「作業中に別のフォルダのファイルを確認しに行って、元の場所に戻るのが面倒くさくなった…」 Linuxを操作していると、こんな経験はありませんか?
深い階層のディレクトリ(例:/var/www/html/project/src/)で作業している最中に、設定ファイルを見るために /etc/nginx/ へ移動し、また元の場所に戻る。この往復を cd コマンドで何度も打つのは非常に手間です。
今回は、そんなディレクトリの移動を劇的に楽にする「迷子防止のパンくずリスト」のようなコマンド、pushd(プッシュディー) と popd(ポップディー) を紹介します。

1. cd コマンドの限界と cd - の小技
まずは前提として、普通の cd コマンドのおさらいと、ちょっとした小技を紹介します。
実は、「1つ前にいたディレクトリに戻る」だけであれば、以下のコマンドで可能です。
cd -(ハイフンを1つ付けるだけです)
これはこれで非常に便利なのですが、「1つ前の場所」しか覚えてくれないという弱点があります。 A → B → C と移動した後でAに戻りたい時、cd - ではBにしか戻れません。
複数の場所を渡り歩きながら、確実に元の場所へ帰還したい。そんな時に活躍するのが今回の主役です。
詳しく㏅コマンドのオプションを紹介した記事
【初心者向け】cdコマンド 「ディレクトリ移動」change directory – コピペで試せるオプション理解 -【Linuxコマンド入門 #3】
cdコマンドについて、よく使うオプションを優先的に紹介します。directory移動を行う コマンド。linux ubuntu terminal command をマスターする。
2. pushd と popd の仕組み(スタックとは?)
この2つのコマンドは、「スタック」という仕組みを使ってディレクトリの履歴を管理します。
スタックとは、「お皿の積み重ね」をイメージしてください。
pushd: 新しいお皿(ディレクトリ)を上に重ねて、そこへ移動する。popd: 一番上のお皿をどかして、その下にあったお皿(前のディレクトリ)へ移動する。
童話「ヘンゼルとグレーテル」で、迷子にならないようにパンくずを落としながら進み、帰りはそれを拾いながら戻るのと同じ原理です。
3. 基本的な使い方と実践
それでは、実際の動きを見てみましょう。
今回のサンプルでは以下のようなフォルダ階層がある環境で試しています。同じように試してみたい場合は、touchやmkdirなどで、適当な場所に環境を作ってみてください。
# 以下のコマンドで移動しているフォルダ構成
$workdir
|--bin
|--html
| |--index.html
|--server
| |--memo.txt
# 同じようなフォルダ階層を作るコマンド(実行する際はテスト用フォルダで実行してください)
mkdir -p html && touch html/index.html;mkdir -p server && touch server/memo.txt;mkdir bin;ステップ1:pushd で移動しながら場所を記憶する
現在、/html にいるとします。ここから /server に移動する際、cd の代わりに pushd を使います。
cd html
pushd ../server
# 実行例
# tukumo@lumenhero :~$ cd html
# tukumo@lumenhero :html$ nano index.html (編集作業など)
# tukumo@lumenhero :html$ pushd ../server (serverに移動)
# ~/server ~/html
# tukumo@lumenhero :server$移動と同時に、画面に ”~/server ~/html”というリストが表示されました。これが「今積み重なっているお皿(記憶した場所)」です。
続けて /bin にも pushd で移動してみます。
pushd ../bin
# 実行例
# tukumo@lumenhero :server$ pushd ../bin (binに移動)
# ~/bin ~/server ~/html
# tukumo@lumenhero :bin$記憶のリストが3つに増えました!
ステップ2:dirs -v で記憶したリストを見る
「今、どこを記憶しているんだっけ?」と思ったら、dirs コマンドで確認できます(-v を付けると番号付きで見やすくなります)。
tukumo@lumenhero :bin$ dirs -v
0 ~/bin
1 ~/server
2 ~/htmlステップ3:popd で元の場所へ帰還する
用事が済んだので、元の場所に戻りましょう。引数なしで popd と打つだけです。
tukumo@lumenhero :bin$ popd
~/server ~/html
tukumo@lumenhero :server$これだけで、1つ前の /server に戻りました。 もう一度 popd を打てば、最初の /html に帰還できます。
長いパスを打ち直す必要は一切ありません!
4. 実務での便利な使い方(シナリオ)
実際の作業中は、こんな使い方が定番です。
- Webサイトのソースコードを編集中 (
/var/www/html/project/...) - 「あ、Webサーバーの設定を確認しなきゃ」 →
pushd /etc/nginx/conf.d/ - 設定を修正して保存。
- 「よし、元の場所に戻って作業再開!」 →
popd
このように、「今の作業を一時中断して別の場所に行き、すぐ戻ってくる」という場面で、pushd と popd は最強の威力を発揮します。
5. 途中にcdを挟んでも問題ない。
pushdで移動後、目的のファイルをどこに置いたっけ?となっても、戻りたいところでpushdしておけば、途中にcdを挟んでも構わないので、メインの作業フォルダへとpushdで移動。細かい作業は特に気にせずcdで移動して作業、元に戻りたいときにpopdすれば戻ることができます。
tukumo@lumenhero :server$ ls
memo.txt
tukumo@lumenhero :server$ cd .. (途中にcdをしても問題ない)
tukumo@lumenhero :~$ popd
~/html
tukumo@lumenhero :html$pushd 引数なしで「反復横跳び」
引数なしの pushd を実行すると、少し面白い挙動をします。
pushd は通常 pushd /etc/ のように移動先を指定しますが、実は何も指定せずに pushd とだけ打つと面白い動きをします。 スタックに積まれている「上から1番目」と「2番目」のディレクトリが入れ替わり、その場所に移動するのです。
# 実行例
dirs -v
# tukumo@lumenhero :server$ dirs -v (スタック確認)
# 0 ~/server
# 1 ~/html
pushd
# tukumo@lumenhero :server$ pushd (引数なしでスワップ)
# ~# tukumo@lumenhero :html$/html ~/server
# tukumo@lumenhero :html$
pushd
# tukumo@lumenhero :html$ pushd (引数なしでスワップ)
# ~/server ~/html
# tukumo@lumenhero :server$AディレクトリとBディレクトリの2箇所で作業している時、引数なしの pushd を打つだけで、AとBを永遠に行ったり来たり(反復横跳び)できます。cd - と似ていますが、スタックを崩さずに往復できるのが強みです。結構便利なので、覚えておくといいかもしれません。
まとめ
cd -: 1つ前のディレクトリにだけ戻れる手軽なコマンド。pushd [ディレクトリ]: 今の場所を記憶(パンくずを落とす)しつつ、指定した場所へ移動する。popd: 記憶した場所(パンくず)を辿って、順番に戻る。dirs -v: 今記憶している場所のリストを確認する。- pushd (引数なし):スタックを反復横跳びできる。
指が cd に慣れきっていると最初は違和感があるかもしれませんが、一度この「一瞬で帰還できる快感」を覚えると手放せなくなりますよ。
次回は、ディレクトリ移動を極めるもう一つの隠し技。 cd の後にディレクトリ名を入力するだけで、どんな深い階層にもワープできる「CDPATH」という設定を紹介します。
指定された記事(ID: 5410)は現在公開されていません。
第四回”Linuxコマンド入門 Part4 ~自分好みの環境を整える~”では、linuxでの作業を効率化し自分好みの環境を作り上げる方法を紹介しています
Linuxコマンド入門 Part4 ~ターミナル操作の効率化とシェル環境のカスタマイズ~
Linuxで、コマンドライン操作を効率化したり、自分好みにカスタマイズする方法を学ぼう。
ここまで読んでいただきありがとうございます。
では、次の記事で。 lumenHero