回答:
pushd
、popd
とdirs
あなたが操作できるようにシェルの組み込みコマンドですディレクトリスタックを。これを使用してディレクトリを変更できますが、元のディレクトリに戻ります。
$ ls
dir1 dir2 dir3
$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir
dirs
コマンドは、スタック上に2つのディレクトリがあることを確認します。dir1
元のディレクトリsomedir
。
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
pushd
&popd
B / C彼らは私がから来ていたところ、私はいつもちょうどすることができます覚えていることから私を保存するスクリプトではpopd
、私が来たところから戻って取得します。私は通常popd >/dev/null 2>&1
、それを黙らせます。私はシェルで毎日cd-を使用しています。この記事では、いくつかの他の時間節約のヒントにもありますthegeekstuff.com/2008/10/...。
cd -
は最後のディレクトリのみを追跡するため、ディレクトリを内部的に変更する関数を呼び出すと問題が発生する可能性があると思います。その場合、関数はリセットされてしまいます-ポップしたいディレクトリではなく、現在のディレクトリに。pushd / popdは最も安全な方法です。注:私は自分の理論をテストしていません。
~/somedir/dir3
最初の後に戻ってみませんpopd
か?
あるために本当に便利なユースケース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
安全にナビゲートするには、常に書き換えられるため、最後の(ゼロ)フォルダーを2回追加する必要があります。
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"
dirs -c
dirsスタックを使用するための1つの単純な使用例は、cdだけではできないことです。
pushd .
現在のディレクトリXXをdirs
スタックに追加します。その後、を使用して移動でき、ディレクトリツリー内の「遠く」に関係なく、cd
XXに戻るだけですpopd
(複数のレベルを横に飛び越えることができます)。特にbashスクリプトで役立ちます。
pushd
/ popd
workはから独立しているためcd
、cd -
。
以下のためにbashの、基本的には:代わりにCD 1を使用しての使用することができますpushd
訪問したディレクトリの履歴が保存されます(正確に::スタック)の実用的な使い方で、directorysを変更すると、1はそれらを切り替えることができます
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
、ディレクトリは最上位に2回だけ移動します(または、位置0にダミーを使用します)。
me@myhost:/home$ dirs -v
0 /home
1 /home
2 /var
3 /tmp
今1..3はそこに位置を維持します
(スタックから現在のディレクトリを解放する/履歴から削除するpopd
)
私が見つけた実用的な用途の1つは、pushdとpopdを使用してディレクトリを切り替えることです。
dir1とdir2の2つのディレクトリがあり、xyzの理由でそれらを連続的に切り替える必要があるとします。
現在、私は2つのディレクトリを持ってsomedirで午前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$
出来上がり、私はdir1にあり、スタックにdir1とdir2があります。再びdir2に切り替えるには、次を実行しますpushd || popd
alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$
これはディレクトリを切り替える簡単な方法です。さて、あなたは何を知っているかもしれません、なぜディレクトリを切り替える必要があるのですか?1つのユースケースは、Webアプリケーションで作業するとき、1つのディレクトリにメイクファイルがあり、ログファイルが別のディレクトリにあることです。多くの場合、アプリケーションをデバッグするとき、ログディレクトリを切り替えて、最新のログを確認し、makeディレクトリに戻って、変更を加えてアプリケーションをビルドする必要があります。
pushd
とpopd
オーバーはcd -
?」何をするのかを正確に説明しているので、明らかにその質問には答えてcd -
いません。(2)言いpushd || popd
たいことは何ですか?はい、それcmdA || cmdB
は実行を意味cmdA
し、それが失敗した場合は実行することを知っていますcmdB
。私はこの文脈でそれが何をするのか尋ねています。 pushd
引数なしの場合、「ディレクトリスタックの上の2つの要素を入れ替える」ことを意味します。現在のディレクトリがディレクトリスタック上の唯一の要素である場合、失敗します。その場合popd
も失敗します。
pushd
popd
pushd || popd
ディレクトリを切り替えるよりもはるかに少ない入力を必要とする2つの明確な方法がありますpushd
。引数なしでこれを行うだけです。cd -
最後のディレクトリに切り替えるためだけに明示的に存在します。さらに、質問はpushd
over の利点を求めましたがcd -
、この回答は明らかに不利な点のみを提供します:より多くのタイピング。
|| popd
トグルが必要なのですか?説明してください。(十分にプッシュされていませんか?)
cd -
2つのディレクトリを切り替えるためだけに使用します。さらにcd
、引数なしでホームディレクトリに戻ります。
簡単に言えば、2つ以上のディレクトリ間を移動する必要がある場合、通常は数回前後に移動しcd -
ます。2つのフォルダを超えるとカットされないからです。
そのため、たとえば、バッファーの履歴を確認したり、長いパスをタブで補完して以前の長いパスに戻ろうとする代わりに、重要なパスを単純に積み重ね、必要に応じて番号だけでそれらに移動できます。複雑なディレクトリ構造と長いパスの間を回転すると、滑らかで迅速になります。
ビルトインを使用すると、スタックの順序を変更したり、不要になったディレクトリをポップアウトしたりして、ワークフローを柔軟にすることもできます。
ディレクトリスタッキングは、複数のディレクトリにまたがる操作のスクリプトでも同様に使用できます。
dirs / popd / pushdの使用が少し不快であることがわかりました。次のコードを.aliasに追加することにより、tcshで個人的なソリューションを思い付きました。
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」というエイリアスを作成しました。現在の作業ディレクトリをファイル〜/ .mydirに保存します。および「cd」。いつでもどこでもそのディレクトリを回復します。「デル」対応するファイルを削除します。「家」dirをホームdirに設定します(cdと同等; p。); 「cdl」には、保存されたディレクトリがリストされます。〜/ .mydir $ bの代わりに〜/ Dropbox / .mydir $ b(または、ownCloudのような他のクラウドサービス)を使用する場合、異なるアカウントとマシン間で好みのディレクトリを使用するスマートな方法が得られることに注意してください。
私は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を使用します
を使用するcd
とcd -
、最近使用した2つのディレクトリのみを切り替えることができます。「ディレクトリワーキングセット」のサイズは2です。
を使用すると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
最終的には、複数のターミナルウィンドウまたはタブ(アクティブに作業しているディレクトリごとに1つ)を開くのと同様の作業スタイルになりますが、すべて1つのターミナルにあります。これにより、画面のスペースを節約できます。さらに、ディレクトリパスはすべて1つのシェルで使用できるため、次のようなことができます。
例:
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
pushd / popdは非常に単純な概念で、これらのコマンドを「ディレクトリスタックを操作する」コマンドとして定義することで教える傾向があるため、理解するのにしばらく時間がかかりました。
別の方法で見ます:
pushd [folder_name] - [folder_name]にcd し、dirスタックの[folder_name]である宛先を文書化しますが、スタックの最上位ディレクトリは常に現在のdirになります。
popd-最初にスタックの一番上にあるディレクトリレコードに移動し、スタックから削除します
dirs -dirスタックを出力します(左端のエントリが現在のディレクトリ(スタックの最上部)であるdir Dbとして扱うことができます)
したがって、最も一般的な2つのユースケースは次のとおりです。
ユースケース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を実行すると、一番上のディレクトリスタックエントリ(常に現在のディレクトリ)に影響することに注意してください。
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
繰り返しますが、任意のディレクトリをドキュメント化し、別のディレクトリに手動で移動すると、スタックに挿入したドキュメント化されたディレクトリに簡単に戻ることができます。
ユースケース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
「文書化」という言葉を使用するか、ある種のDbが概念を単純化するように、dirスタックについて考えてください。
cd -
、、短縮のエイリアスcd ..
などがある場合)。