システム管理のために複数のディレクトリを切り替える高速なコマンドラインの方法は何ですか?


46

システム管理のために複数のディレクトリを切り替える高速なコマンドラインの方法は何ですか?とを使用pushd .popdてトグルすることができますが、スタックの一番下から永久にポップするのではなく、複数を保存して循環させる場合はどうなりますか?


$CDPATHたぶん?
ロアイマ

6
ああ、cd -この質問からグーグルで扇動された後、私はちょうど学んだ。
Nacht-モニカの復活

@Nacht:以前はどのようにファイル構造をナビゲートしましたか?
ローンボート

1
cd手でどこでもやった。痛かった。ただし、Tabキーによる自動補完を使用しました。
-Volomike

1
たぶん、あなたはzaを試してみたいと思うでしょ。同じカップルのカップル内でたくさんジャンプするときに非常に便利です。
ロルフ

回答:


28

使用pushdして、あなたのディレクトリスタック内のディレクトリのための特別な名前:~1~2など

例:

tmp $ dirs -v
 0  /tmp
 1  /tmp/scripts
 2  /tmp/photos
 3  /tmp/music
 4  /tmp/pictures
tmp $ cd ~3
music $ dirs -v
 0  /tmp/music
 1  /tmp/scripts
 2  /tmp/photos
 3  /tmp/music
 4  /tmp/pictures
music $ cd ~2
photos $ cd ~4
pictures $ cd ~3
music $ cd ~1
scripts $ 

この方法で使用する最も効果的な方法pushdは、ディレクトリリストをロードしてから、現在のディレクトリとなるディレクトリをもう1つ追加し、スタック内のディレクトリの位置に影響を与えずに静的な番号の間をジャンプすることです。


また、それは注目に値しますcd -あなたがしていた最後のディレクトリに行くことができます。 だから、意志cd ~-

利点~-を超えるだけの-ものがある-に固有であるcdのに対し、~-展開されているシェルによってその同じように~1~2ある、など。これは、非常に長いディレクトリパス間でファイルをコピーするときに便利です。例えば:

cd /very/long/path/to/some/directory/
cd /another/long/path/to/where/the/source/file/is/
cp myfile ~-

上記は次と同等です:

cp /another/long/path/to/where/the/source/file/is/myfile /very/long/path/to/some/directory/

1
使用することもできますcd -
-Volomike

cd -Forthのように動作しますDROP DUP。たとえば、ディレクトリaで、スタックabcdで始まる場合、a cd -はスタックをbbcdに変更します。おそらくそれはbashバグかもしれません。1cd -でスタックがabcdに戻るからです。このことからcd -、スタックを変更することに加えて、いくつかの別個のデータ構造を使用して前のディレクトリを格納することが推測できます。
agc

3
@agc、他に何もcd -使用$OLDPWDしません。
ワイルドカード

それで、おそらくcd -以前のbash機能があり、その後スタックを追加しましたが、よりシンプルな設計を望んでいるよりも古いコードを壊すことを恐れていました。前の修正 は、cd -Forth OLDPWD @ SWAP OLDPWD ! DUP .とは異なりcd foocd -スワップインされたディレクトリの名前を出力します。
agc

または、インタラクティブなプッシュラッパーが常に存在します(その質問に対する他の回答には、オートジャンプなどが含まれます)。
役に立たない

42

bashおよびオプションを使用pushdしたの組み込みは、ディレクトリスタックを回転させることができます。おそらくそのスタックはゼロベースの配列であるため、構文は少し混乱する可能性があります。これらの単純なラッパー関数は、ディレクトリスタックを循環します。+-

# cd to next     directory in stack (left  rotate)
ncd(){ pushd +1 > /dev/null ; }
# cd to previous directory in stack (right rotate)
pcd(){ pushd -0 > /dev/null ; }

テスト:4つのディレクトリのスタックをセットアップします。

dirs -c   # clear directory stack
cd /home ; pushd /etc ; pushd /bin ; pushd /tmp

これで/ tmpが現在のディレクトリになり、スタックは次のようになります。

/tmp /bin /etc /home

スタック内の次のディレクトリに4回変更(および表示)します。

ncd ; pwd ; ncd ; pwd ; ncd ; pwd ; ncd ; pwd

出力:

/bin
/etc
/home
/tmp

スタック内の前のディレクトリに4回変更(および表示)します。

pcd ; pwd ; pcd ; pwd ; pcd ; pwd ; pcd ; pwd

出力:

/home
/etc
/bin
/tmp

上の注記cd -ワイルドカードの答えはどのように説明する助けてcd -使用していません$ DIRSTACKの配列、(それが使用する$ OLDPWように、変数)cd -は影響しません$ DIRSTACKスタックベースのスワップがすべき方法。これを修正するために、単純な$ DIRSTACKベースのスワップ関数を次に示します。

scd() { { pushd ${DIRSTACK[1]} ; popd -n +2 ; } > /dev/null ; }

テスト:

dirs -c; cd /tmp; \
pushd /bin; \
pushd /etc; \
pushd /lib; \
pushd /home; \
scd; dirs; scd; dirs

出力:

/bin /tmp
/etc /bin /tmp
/lib /etc /bin /tmp
/home /lib /etc /bin /tmp
/lib /home /etc /bin /tmp
/home /lib /etc /bin /tmp

私の不満は、スタックにアイテムを入れて、スタックをクリアするまでアイテムを保持したいことです。こうすることで、必要に応じて3つのディレクトリのそれぞれをプッシュ、プッシュ、プッシュ、サイクルすることができます。たとえば、ブラウザのタブのように3つのディレクトリを切り替え、タブを閉じるまで前後に移動する必要があるとします。これはコマンドラインの方法でこれに対処しますか?
Volomike

5
はい、試してみてください。最上位のアイテムを削除するには、を実行しpopd、ディレクトリを変更せずに削除するには、を実行しますpopd -n。スタックをクリアするために行いますdirs -cbashの設計者がこのような便利な関数を直感的でない構文に埋め込んでいたのは残念です。参照のman bashpushddirsなど
AGC

動作します!そして、ドキュメントでは泥として明確でした。テクニックを知った今、そのシンプルさが気に入っています。
-Volomike

13

fasdをインストールすることをお勧めします。名前のごく一部を入力するだけで、すでにアクセスしたディレクトリにすばやくジャンプできます。

例:にアクセス/home/someName/scripts/した場合はz scr、たとえば入力するだけでそこにジャンプできます。履歴スタックなどの順序を覚えておくと、はるかに便利です。


10

とき、あなたはcdどこか、bashは、環境変数の古い作業ディレクトリを格納します$OLDPWD

でそのディレクトリに切り替えることができます。cd -これはと同等cd "$OLDPWD"です。

次のようにディレクトリ間を行き来できます。

blue$ cd ~/green
green$ cd -
blue$ cd -
green$

6

xyzzyこれを行うための名前のスクリプトを作成しました。

#!/bin/bash

i="$1"
i=$((${i//[^0-9]/}))
i="$(($i-1+0))"

b="$2"
b=$((${b//[^0-9]/}))
b="$(($b-1+0))"

if [ -z "$XYZZY_INDEX" ]; then
    XYZZY_INDEX="$((-1))"
fi

if [ ! -f "/tmp/xyzzy.list" ]; then
    touch /tmp/xyzzy.list
    chmod a+rw /tmp/xyzzy.list
fi
readarray -t MYLIST < /tmp/xyzzy.list

showHelp(){
read -r -d '' MYHELP <<'EOB'
xyzzy 1.0

A command for manipulating escape routes from grues. Otherwise known as a useful system admin
tool for storing current directories and cycling through them rapidly. You'll wonder why this
wasn't created many moons ago.

Usage: xyzzy [options]

help/-h/--help      Show the help.

this/-t/--this      Store the current directory in /tmp/xyzzy.list

begone/-b/--begone  Clear the /tmp/xyzzy.list file. However, succeed with a number and
            it clears just that item from the stored list.

show/-s/--show      Show the list of stored directories from /tmp/xyzzy.list

. #         Use a number to 'cd' to that directory item in the stored list. This syntax is odd:

            . xyzzy 2

            ...would change to the second directory in the list

. [no options]      Use the command alone and it cd cycles through the next item in the stored 
            list, repeating to the top when it gets to the bottom. The dot and space before xyzzy
            is required in order for the command to run in the current shell and not a subshell:

            . xyzzy

Note that you can avoid the odd dot syntax by adding this to your ~/.bashrc file:

  alias xyzzy=". xyzzy"

and then you can do "xyzzy" to cycle through directories, or "xyzzy {number}" to go to a
specific one.

May you never encounter another grue.

Copyright (c) 2016, Mike McKee <https://github.com/volomike>
EOB
    echo -e "$MYHELP\n"
}

storeThis(){
    echo -e "With a stroke of your wand, you magically created the new escape route: $PWD"
    echo "$PWD" >> /tmp/xyzzy.list
    chmod a+rw /tmp/xyzzy.list
}

begoneList(){
    if [[ "$b" == "-1" ]]; then
        echo "POOF! Your escape routes are gone. We bless your soul from the ever-present grues!"
        >/tmp/xyzzy.list
        chmod a+rw /tmp/xyzzy.list
    else
        echo -n "Waving your wand in the dark, you successfully manage to remove one of your escape routes: "
        echo "${MYLIST[${b}]}"
        >/tmp/xyzzy.list
        chmod a+rw /tmp/xyzzy.list
        for x in "${MYLIST[@]}"; do
            if [[ ! "$x" == "${MYLIST[${b}]}" ]]; then
                echo "$x" >> /tmp/xyzzy.list
            fi
        done
    fi
}

showList(){
    echo -e "These are your escape routes:\n"
    cat /tmp/xyzzy.list
}

cycleNext(){
    MAXLINES=${#MYLIST[@]}
    XYZZY_INDEX=$((XYZZY_INDEX+1))
    if [[ $XYZZY_INDEX > $(($MAXLINES - 1)) ]]; then
        XYZZY_INDEX=0
    fi
    MYLINE="${MYLIST[${XYZZY_INDEX}]}"
    cd "$MYLINE";
}

switchDir(){
    MYLINE="${MYLIST[${i}]}"
    cd "$MYLINE";
}

if [[ "$@" == "" ]];
then
    cycleNext
fi;

while [[ "$@" > 0 ]]; do case $1 in
    help) showHelp;;
    --help) showHelp;;
    -h) showHelp;;
    show) showList;;
    -s) showList;;
    --show) showList;;
    list) showList;;
    this) storeThis;;
    --this) storeThis;;
    -t) storeThis;;
    begone) begoneList;;
    --begone) begoneList;;
    *) switchDir;;
    esac; shift
done

export XYZZY_INDEX

これを使用する方法は、/usr/binフォルダーにコピーしてからそのフォルダーにコピーするchmod a+xことです。次に、ルートとユーザーアカウント~/.bashrcファイルを編集して、これらの行を下部に追加します。

alias xyzzy='. xyzzy'
alias xy='. xyzzy'

「xy」は、入力を高速化するためのコマンドの短縮形です。

次に、現在のディレクトリをリストに保存できます...

xyzzy this

...必要に応じて繰り返します。このリストに必要なディレクトリを入力すると、/ tmpが再び消去されるため、コンピューターを再起動するまでそこに残ります。次に入力できます...

xyzzy show

...現在保存されているディレクトリを一覧表示します。ディレクトリに切り替えるには、2つの選択肢があります。1つのオプションは、次のようにインデックス(および1ベースのインデックス)でパスを指定することです。

xyzzy 2

...これは、リストの2番目の項目であるディレクトリに切り替わります。または、インデックス番号を省略して、次の操作を行うこともできます。

xyzzy

...必要に応じて各ディレクトリをループ処理します。実行できるその他のコマンドについては、次を入力します。

xyzzy help

もちろん、私が追加した愚かなエコー文のほうが仕事はもっと楽しいです。

xyzzyはCollosal Caveテキストアドベンチャーへの参照であることに注意してください。xyzzyと入力すると、ゲーム内の2つの部屋を切り替えて、grみを回避できます。


2
+1これで遊んでみました。いいですが、ディレクトリがまだ追加されていない場合にxyzzyだけを入力すると失敗するようです。cyclenext()でMAXLINES -eq 0のテストがもう1つ必要です。
ジョー

5

z [link]と呼ばれる小さなスクリプトを使用します。これは、あなたが要求したとおりに動作しない場合でも興味深いものです。

NAME
       z - jump around

SYNOPSIS
       z [-chlrtx] [regex1 regex2 ... regexn]

AVAILABILITY
       bash, zsh

DESCRIPTION
       Tracks your most used directories, based on 'frecency'.

       After  a  short  learning  phase, z will take you to the most 'frecent'
       directory that matches ALL of the regexes given on the command line, in
       order.

       For example, z foo bar would match /foo/bar but not /bar/foo.

たぶん何かを見逃しましたが、zスクリプト自体はどこにありますか?
ジョー

申し訳ありませんが、リンクはz上にありました。見やすくするために編集します。
グレイファー

5

またcd_func、Petar Marinovによるものもあり、基本的cdに最大10エントリの履歴があります:http : //linuxgazette.net/109/misc/marinov/acd_func.html

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi

Siimply使用cd --あなたは10のディレクトリに過去最高のリストを表示するcdに編とcd -N(どこNそこに行くためのエントリのインデックスがあります)。


4

ほとんどの場合、ZSHとoh-my-zshプロファイルを使用します。次の一致を端末に入力できます。

# cd /ho

次に、単に矢印(上下)を使用して、上記の文字で始まるエントリのみを表示するすべてのシェル履歴をたどることができます。だから、例えば、あなたがに行っている場合/home/morfik/Desktop//home/morfik/something/、あなたは非常に高速なディレクトリを切り替えることができます。シェル履歴にいくつのエントリがあるかは関係ありませんが、たくさんある場合は、より良い表現を使用cd /home/morfしてください。つまり、ここでキーボードの上下矢印を押します。

ソリューションを実現する別の方法もあります。この場合、tmuxFZFを使用する必要があります。次に、たとえばctrl-rなどのホットキーを作成します。これを押すと、現在のウィンドウが分割され、次のように表示されます。

ここに画像の説明を入力してください

これで、式を使用してリストを検索できます。を入力^cd /mediaしたところ、フレーズで始まるエントリのみが返されます。もちろん、'cd 'homeコマンドとディレクトリ名全体(パスではなく、名前だけ)に一致するように入力することもできます。

ここに画像の説明を入力してください


4

あなたは~/.bashrc(または同等の)エイリアスの束でこれを達成することができます

主な目標はd5、プール内のディレクトリを切り替えるための最小限のタイピング(プール内のディレクトリ番号5へのジャンプなど)です。また、プールへ/からディレクトリを簡単に追加/削除できるようにしたい:

alias pd=pushd
alias po=popd
alias d='dirs -v'
alias d0=d
alias d1='pd +1'
alias d2='pd +2'
alias d3='pd +3'
alias d4='pd +4'
alias d5='pd +5'
alias d6='pd +6'
alias d7='pd +7'
alias d8='pd +8'
alias d9='pd +9'
alias d10='pd +10'
# -- feel free to add more aliases if your typical dir pool is larger than 10

これで、スタック上のディレクトリをプッシュするたびに、位置0の番号付きプール(現在のディレクトリ)に追加され、ごくわずかな入力(d<N>)を使用してジャンプ(ディレクトリの切り替え)でき、番号付きの現在のプールを任意の場所で表示できます時間を入力するだけdです。

これらのエイリアスの使用例:

番号付きのdir-poolを表示します(現在のdirは#0です)

$ d
 0  /tmp
 1  /
 2  /usr

ディレクトリ間の切り替え:使用 d<N>

$ d2
$ pwd
/usr

プールに新しいディレクトリを追加します

$ pd /var/log
$ d
 0  /var/log
 1  /usr
 2  /tmp
 3  /

さらにジャンプしてください:

$ d3
$ pwd
/

$ d3
$ pwd
/tmp

$ d
 0  /tmp
 1  /
 2  /var/log
 3  /usr

プールから最上位(現在の)ディレクトリを削除またはポップします

$ po
$ d
 0  /
 1  /var/log
 2  /usr

2

iselectがインストールされている場合、次のようなことができます。

$ alias dirselect='cd $(iselect -a $(dirs -l -p | sort -u))'
$ dirselect

これにより、ディレクトリを選択するためのフルスクリーンncursesベースのインタラクティブな矢印キーのナビゲーションメニューが表示されますcd

pushd現在のシェルセッションで使用していない場合、メニューのディレクトリのリストは、現在のディレクトリの1つのエントリから始まります。エントリが1つしかない場合、このdirselectエイリアスはcdメニュー画面なしでそれだけになります。したがって、事実上何もしません(cd -有用なことを行うことを防ぐことを除く)

リストに新しいディレクトリを追加するには、を使用しますpushd dir(または、同時に-ing pushd -n dirせずにディレクトリを追加しますcd)。

orでpushd次のようなことを行うことで、スタックを事前に設定できます。.bashrc~/.bash_profile

for d in /var/tmp /tmp /path/to/somewhere/interesting ; do 
  pushd -n "$d" > /dev/null
done

popdまたはでエントリを削除できますpopd -n

参照してくださいhelp pushdhelp popdそして、help dirsより多くの情報のためのbashインチ そして、もちろん、man iselect

ところで、iselectおそらくあなたのディストリビューション用にあらかじめパッケージ化されています。DebianやUbuntuなど、そしておそらく他の人向けです。



2

ジャンプを使用して作業ディレクトリをすばやく変更しています。

現在のディレクトリを追加するには:

jump -a [bookmark-name]

すべてのブックマークをリストするには:

jump -l

例えば:

------------------------------------------------------------------
 Bookmark    Path                                                 
------------------------------------------------------------------
 reports     ~/mydir/documents/reports
 projects    ~/documents/projects
 dl          ~/Downloads                     
------------------------------------------------------------------

これで、別のディレクトリに簡単にジャンプできます。

jump reports

bashとzshのオートコンプリートをサポートしています。


編集(@Joeへの応答):バイナリjump-binはに保存され/usr/local/bin、bash統合スクリプト(にある私のPC内/var/lib/gems/1.9.1/gems/jump-0.4.1/bash_integration/shell_driver)を使用して、jumpを呼び出すbash関数を作成しますjump-bin


ジャンプコマンドはどこにありますか?私はそれを持っていないし、どこでそれを手に入れるかすぐにはわかりません。
ジョー

2

aliasナビゲートに使用します。頻繁にアクセスされるディレクトリが少ない場合は、単にエイリアスを設定します。例えば、

alias e='cd /etc'
alias h='cd /home'
alias al='cd /var/log/apache2/'

それから単に

e 

に連れて行きます/etc

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.