cd - さらに歴史へ

cd - さらに歴史へ

ディレクトリ履歴をさらに遡るために、履歴内の前のディレクトリに移動する に似たものを使用するにはどうすればよいですかcd -? たとえば、履歴が次のようになっているとします: (1 が現在のものです。)

  1. ~/
  2. ~/その他のディレクトリ
  3. ~/本当に長いディレクトリ名。もう一度入力したくないが、エイリアスにするには十分ではない

ここで使用すると#2cd -に移動し~/otherDirectory、もう一度使用すると、~/非常に長いディレクトリ #3 (移動したいディレクトリ) ではなく、#1 (移動したくないディレクトリ) に戻ります。要約すると、ディレクトリ履歴をさらに遡るにはどうすればよいでしょうか。この機能を追加するために記述できる bash はありますか。

上矢印を使用してコマンド履歴をたどるのと同じように、ディレクトリ履歴 (複数のディレクトリ) をさかのぼって戻ろうとしています。この質問が以前に尋ねられたことがないことがこれで明らかになることを願っています。

答え1

Bash のディレクトリ スタック

bash にはディレクトリ スタックと呼ばれるものがありますDIRSTACK。スタックはコンピュータ サイエンスの基本的なデータ構造で、要素を積み重ねて保存できますが (本のスタックのように)、最新の要素 (一番上) にのみアクセスできます。

ここに小さなデモがあります - ディレクトリ スタックに何かをプッシュするたびに、現在の作業ディレクトリがその項目に設定されます。ポップするたびに、スタックから一番上 (左端) の項目が削除され、次の利用可能な項目に戻ります。

$>  # pushd navigates to and stores the directory given
$> pwd
/home/xieerqi
$> pushd bin
~/bin ~
$> pushd /etc
/etc ~/bin ~
$> # popd deletes leftmost item, returns to next directory on left$> pwd
/etc
$> popd
~/bin ~
$> pwd
/home/xieerqi/bin
$> 

最新のアイテムは常にスタックの一番上に格納されます。cd

$> dirs
/ /etc ~
$> cd /var
$> dirs
/var /etc ~
$> 

このdirsコマンドはスタックからn番目の要素を取得できます。その出力を引数として使用することで、cdスタック自体に影響を与えることなく、スタック上の任意のディレクトリに移動できます。現在の作業ディレクトリ(および最上位の要素)を変更しても/etc/~スタック要素1と2が同じままであることに注意してください。

$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~

DIRSTACK の動作を使用して Web ブラウザの動作をシミュレートする

Web ブラウザで URL A から URL B、URL C に移動する場合、戻る矢印キーと進む矢印キーを使用してそれらの間を行ったり来たりできることをご存知ですか?

さて、次の 2 つの関数を使用して、bash でも同じことを行うことができます。

cd()
{
  if [ $# -eq 0   ]; then
       pushd "$HOME" > /dev/null
  else
       pushd "$@" > /dev/null
  fi
}

cdback()
{
  popd > /dev/null
  printf "Returned to:%s\n" "$( dirs +0)"

}

関数はエイリアスよりも優先されるため、これを有利に利用して、与えられたすべての引数に対して各呼び出しを行うことができますcd(pushd引数が指定されていない場合は、ホーム ディレクトリに戻ります。動作は同じですが、記録されます)。

$> pwd
/home/xieerqi
$> cd /etc
$> cd /var
$> cd /usr
$> pwd
/usr
$> cdback
Returned to:/var
$> pwd
/var
$> cd
$> pwd
/home/xieerqi

他のシェルのディレクトリスタック

csh独自のディレクトリスタック実装を持っていkshます が、エディの実装

forループで上昇する

特定の数のディレクトリを移動するには、cd ..特定の回数だけ呼び出す関数を書くことができます。たとえば、次のカスタム関数があります。.bashrc

function goUp # go up x number of dirs
{
  num=$1
  while [ num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}
# ---

これを3つのディレクトリに移動するために呼び出すとgoUp 3cd ..3回呼び出されます

inode番号の使用この方法は、フォルダ名が難しい文字や認識できない文字を含む場合によく使用されます。とstatの組み合わせを使用して、 移動したいディレクトリのinode番号を見つけます。findcd

$> stat $HOME/bin/sh/
  File: ‘/home/xieerqi/bin/sh/’
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 5795531     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2015-08-19 15:27:38.280529273 -0600
Modify: 2016-02-20 17:03:49.822700405 -0700
Change: 2016-02-20 17:03:49.822700405 -0700
 Birth: -
$> cd $(find $HOME -inum 5795531 -type d 2>/dev/null)
$> pwd
/home/xieerqi/bin/sh

findもちろん、ディレクトリ ツリー全体を再帰的に走査するため、少し遅くなる可能性があります。

答え2

~/really/long/directory/nameにcdしていて、~/really/longだけに行きたい場合は、cd ~/really/long'long'のサブディレクトリにいる場合でも使用できます。

~/really/longから戻ってきたい場合には、次のようにします。

Cd

そして、上矢印キーを使ってコマンド履歴をたどって、使用した場所まで移動します。

Cd ~/really/long

関連情報