web-dev-qa-db-ja.com

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

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

47
Volomike

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/
29
Wildcard

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

# 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ベースのswap関数を次に示します。

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
42
agc

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

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

13
kaqqao

cdをどこかに置くと、Bashは古い作業ディレクトリに環境変数$OLDPWDを格納します。

cd -は、cd "$OLDPWD"と同じです。

次のようにディレクトリ間を行き来することができます:

blue$ cd ~/green
green$ cd -
blue$ cd -
green$
10
RJHunter

これを行うために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

もちろん、私が追加したばかげたechoステートメントを使用すると、作業がより楽しくなります。

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

6
Volomike

私は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.
5
Graipher

Petar Marinovのcd_funcもあり、基本的に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

単純にcd --を使用して、過去にcdedした最大10個のディレクトリのリストを表示し、cd -NNはエントリのインデックス)を使用してそこに移動します。

5
phk

これは、~/.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プールを表示します(現在の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
4
arielf

私は主に oh-my-zsh プロファイルでZSHを使用します。端末に次の一致を入力できます。

# cd /ho

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

解決策を達成する別の方法もあります。この場合、 tmux および [〜#〜] fzf [〜#〜] を使用する必要があります。次に、ctrl-rなどのホットキーを作成します。これを押すと、現在のウィンドウが分割され、次のように表示されます。

enter image description here

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

enter image description here

4

5個または10個のディレクトリがあり、使用頻度が高く、必ずしも最近使用された5個または10個のディレクトリに関心がない場合は、次のようなコマンドエイリアスを設定します。

alias cdw="cd /var/www/html" 

そして、Apacheのホームページのディレクトリに移動するときは、 シンボリックリンクのエイリアスと同等 で答えたように、cdwと入力します。

2
Mark Stewart

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

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

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

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

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

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

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

popdまたはpopd -nを使用してエントリを削除できます。

詳細については、bashのhelp pushdhelp popdhelp dirsをご覧ください。そしてもちろん、man iselect

ところで、iselectはおそらくあなたのディストリビューション用にあらかじめパッケージ化されて利用可能です。 DebianやUbuntuなど、おそらく他の人も対象です。

2
cas

jump を使用して、作業ディレクトリをすばやく変更しています。

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

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にあります)を使用してbash関数jumpを作成します。 jump-binを呼び出します。

2
agold

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

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

その後、単に

e 

/etc

2
Security Beast