多くの Linux 関係者は、
pushd
と
popd
について聞いたことはありませんが、それらは永遠に存在しています。また、コマンド ラインでディレクトリを移動するプロセスを劇的に高速化することもできます。使用方法について説明します。
プッシュとポップとは何ですか?
Bill Joy
が 1978 年の
C Shell
に取り入れた革新の 1 つは、ディレクトリ スタックの概念と、それを操作する手段である
pushd
と
popd
。模倣は心からのお世辞であり、ディレクトリ スタック、
pushd
、
popd
すぐに他のシェル (Bash など) や他のオペレーティング システムにさえ組み込まれました。
スタックの概念は単純です。項目は一度に 1 つずつスタックに配置され、最後に追加された項目が常に一番上の位置を占めます。アイテムがスタックから取得されると、上から下に順番に削除されます。この性質のスタックは、多くの場合 、後入れ先出し (LIFO) キューと呼ばれます。
実際には、
pushd
と
popd
これよりももう少し柔軟性がありますが、これは今のところ覚えておくと良いモデルです。
ここではディレクトリ スタックについて言及しているので、
pushd
と
popd
の “d” が “directory” を表すことはおそらく驚くべきことではありません。これらのコマンドを使用すると、ディレクトリをディレクトリ スタックにプッシュしたり、ディレクトリ スタックからポップ オフしたりできます。
しかし、それは私たちにどのような利益をもたらすのでしょうか?
Pushd がスタックにデータを取り込む方法
pushd
使用すると、次の 3 つのことが起こります。
-
cdを使用した場合と同じようにディレクトリを変更します。 - ディレクトリの名前とパスがスタックに追加されます。
- スタックは、スペースで区切られたディレクトリのリストとして表示されます。
次の例では、新しい
pushd
コマンドごとにディレクトリ スタックがどのように増加するかに注目してください。また、スタックの最上部が左側にあることにも注意してください。ここに新しいエントリが表示されます。
最初の
pushd
コマンドの後、スタックには、移動したディレクトリと移動したディレクトリの 2 つのエントリが存在します。
この例では、次のように入力します。
Pushd ~/デスクトップ
Pushd ~/音楽
Pushd ~/ドキュメント
Pushd ~/写真
押した〜
最後の
pushd
コマンドはホーム ディレクトリに戻ったので、スタック内の最初と最後のエントリはチルダ (
~
) で、これがホーム ディレクトリを表します。これは、ディレクトリがすでにスタックに存在しているにもかかわらず、他の
pushd
コマンドに対して再度追加されることを示しています。
また、スタックの一番左のエントリ (最後に追加されたエントリ) が現在のディレクトリであることにも注意してください。
dirs コマンド
以下に示すように
dirs
コマンドを使用して、ディレクトリ スタックを表示できます。
ディレクトリ
スタックには影響せず、表示されるだけです。
pushd
で使用できるオプションの一部は、スタック内のディレクトリの位置を参照します。
各ディレクトリの数値位置を確認したい場合は、以下に示すように
-v
(垂直) オプションを使用できます。
dirs -v
チルダ (
~
) の代わりにホーム ディレクトリへのパスを綴り表示したい場合は、次のように
-l
(長い形式) オプションを追加します。
dirs -v -l
スタックへのディレクトリの追加
これまで見てきたように、
pushd
コマンドを使用すると、ディレクトリを変更し、新しいディレクトリをスタックに追加し、スタックを表示するという 3 つの処理が行われます。
-n
(ローテーションなし) オプションを使用すると、現在のディレクトリを変更せずにディレクトリをスタックに追加できます。
ディレクトリスタックは次のとおりです。
dirs -v -l
次に、-n オプションを指定して
pushd
コマンドを使用し、パラメータとして
/home/dave
ディレクトリにパスします。次に、ディレクトリ スタックを再度確認します。
次のように入力します。
Pushd -n /ホーム/デイブ
dirs -v -l
/home/dave
ディレクトリは、スタックの 2 番目の場所であるスロット 1 のスタックに追加されました。スロット 0 は常に現在のディレクトリであるため、先頭の位置を占めることはできません。
現在のディレクトリ
~/Videos
を離れなかったので、スタック内の別の位置にローテーションされませんでした。
スタックをローテーションしてディレクトリを変更する
pushd
で数値パラメータを使用すると、スタック内の任意のディレクトリに移動でき、その際にスタックが回転します。移動することを選択したディレクトリがスタックの最初のエントリになります。
スタック内のディレクトリは、位置番号によって参照します。スタックの一番上または一番下から数えることができます。 +3 などの正の数の場合は、上から数えます。 -2 などの負の数の場合は、下から数えます。
/home/dave/Documents ディレクトリは 3 番目の位置にあります。次のコマンドを使用して、そのディレクトリを移動できます。
プッシュド+3
選択したディレクトリより上のスタック内のディレクトリは、スタックの一番下に移動されます。選択したディレクトリが最上位を占め、そのディレクトリに移動します。
スタックの一番下にあるディレクトリに変更したい場合は、次のコマンドを使用できます。
プッシュ -0
最後のディレクトリは最初のスロットに移動され、他のディレクトリはすべてスタックの下に移動されます。
~/Pictures
ディレクトリに変更されます。
Popdコマンド
popd
コマンドを使用して、スタックからディレクトリを削除できます。
ディレクトリ スタックを見ると、位置 1 のディレクトリが
/home/dave
であることがわかります。これをスタックから削除するには、次のように入力して番号を
popd
に渡します。
dirs -v -l
ポップド+1
/home/dave
ディレクトリが削除され、スタック内でその下にあったディレクトリはそれぞれ 1 つ上の位置に移動しました。
pushd
でできるのと同じように、
popd
でスタックの一番下から数えることができます。スタックから最後のディレクトリを削除するには、次のように入力します。
ポップ -0
~/Music
ディレクトリはスタックの最後の位置から削除されます。
ディレクトリを変更し、何かを行ってから前のディレクトリに戻るには、
pushd
と
popd
一緒に使用できます。
別のディレクトリに移動するには、
pushd
を使用します。
popd
を使用して、スタック内の最上位のディレクトリを破棄し、2 番目の位置のディレクトリに移動します。これは移動元のディレクトリなので、元のディレクトリに戻ります。
次のように入力します。
押した〜
ポップ
~/Projects
ディレクトリから開始し、ホーム ディレクトリに
pushd
から、
~/Projects
ディレクトリに
popd
戻りました。
スタック全体を回転する
ここでは、いくつかのネストされたディレクトリを含むスタックをローテーションする方法を説明しますが、ファイル システム内の任意の場所にある任意のディレクトリを使用できます。
ネストの最も深いレベルは次のとおりです。
/ホーム/デイブ/プロジェクト/htg/記事
ホーム ディレクトリから、article ディレクトリに到達するまで、各ディレクトリを徐々に下っていきます。次に、ディレクトリ スタックを見てみましょう。
次のように入力します。
Pushd ~/プロジェクト
プッシュhtg
プッシュ記事
dirs -v -l
pushd +1
コマンドを繰り返し発行すると、ディレクトリのスタックを何度も繰り返すことができます。これを頻繁に行う場合は、
pushd +1
エイリアス
の良い候補になります。
次のように入力します。
プッシュド+1
スタック上のスタンピング
昔の習慣に戻して、
cd
使用してディレクトリを変更するのは簡単です。これを行うと、スタック内の最初のディレクトリをスタンプすることになります。最初のスロットは現在の作業ディレクトリ用に予約されており、他のスロットは位置を変更しないため、これは避けられません。
これを行うには、次のように入力します。
dirs -v -l
CD ~/音楽
dirs -v -l
pushd
コマンドと
popd
コマンドに慣れると (おそらく、これらのコマンドを使用していくつかのエイリアスを作成すると)、ディレクトリ間を超高速に移動できるようになります。
これが、私たちが コマンドライン を使い回る理由です。効率は非常に重要ですよね?





