システム管理のために複数のディレクトリを切り替える高速なコマンドラインの方法は何ですか?とを使用pushd .
しpopd
てトグルすることができますが、スタックの一番下から永久にポップするのではなく、複数を保存して循環させる場合はどうなりますか?
cd -
この質問からグーグルで扇動された後、私はちょうど学んだ。
cd
手でどこでもやった。痛かった。ただし、Tabキーによる自動補完を使用しました。
システム管理のために複数のディレクトリを切り替える高速なコマンドラインの方法は何ですか?とを使用pushd .
しpopd
てトグルすることができますが、スタックの一番下から永久にポップするのではなく、複数を保存して循環させる場合はどうなりますか?
cd -
この質問からグーグルで扇動された後、私はちょうど学んだ。
cd
手でどこでもやった。痛かった。ただし、Tabキーによる自動補完を使用しました。
回答:
使用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/
cd -
cd -
Forthのように動作しますDROP DUP
。たとえば、ディレクトリaで、スタックabcdで始まる場合、a cd -
はスタックをbbcdに変更します。おそらくそれはbash
バグかもしれません。1秒cd -
でスタックがabcdに戻るからです。このことからcd -
、スタックを変更することに加えて、いくつかの別個のデータ構造を使用して前のディレクトリを格納することが推測できます。
cd -
使用$OLDPWD
しません。
cd -
以前のbash機能があり、その後スタックを追加しましたが、よりシンプルな設計を望んでいるよりも古いコードを壊すことを恐れていました。前の修正 は、cd -
Forth OLDPWD @ SWAP OLDPWD ! DUP .
とは異なりcd foo
、cd -
スワップインされたディレクトリの名前を出力します。
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
popd
、ディレクトリを変更せずに削除するには、を実行しますpopd -n
。スタックをクリアするために行いますdirs -c
。bashの設計者がこのような便利な関数を直感的でない構文に埋め込んでいたのは残念です。参照のman bash
下pushd
、dirs
など
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みを回避できます。
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.
また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
そこに行くためのエントリのインデックスがあります)。
ほとんどの場合、ZSHとoh-my-zshプロファイルを使用します。次の一致を端末に入力できます。
# cd /ho
次に、単に矢印(上下)を使用して、上記の文字で始まるエントリのみを表示するすべてのシェル履歴をたどることができます。だから、例えば、あなたがに行っている場合/home/morfik/Desktop/
と/home/morfik/something/
、あなたは非常に高速なディレクトリを切り替えることができます。シェル履歴にいくつのエントリがあるかは関係ありませんが、たくさんある場合は、より良い表現を使用cd /home/morf
してください。つまり、ここでキーボードの上下矢印を押します。
ソリューションを実現する別の方法もあります。この場合、tmuxとFZFを使用する必要があります。次に、たとえばctrl-rなどのホットキーを作成します。これを押すと、現在のウィンドウが分割され、次のように表示されます。
これで、式を使用してリストを検索できます。を入力^cd /media
したところ、フレーズで始まるエントリのみが返されます。もちろん、'cd 'home
コマンドとディレクトリ名全体(パスではなく、名前だけ)に一致するように入力することもできます。
~/.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
です。
これらのエイリアスの使用例:
$ 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
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 pushd
、help popd
そして、help dirs
より多くの情報のためのbashインチ そして、もちろん、man iselect
。
ところで、iselect
おそらくあなたのディストリビューション用にあらかじめパッケージ化されています。DebianやUbuntuなど、そしておそらく他の人向けです。
5つまたは10個のディレクトリを頻繁に使用し、最近使用した 5つまたは10個のディレクトリを必ずしも気にしない場合は、次のようなコマンドエイリアスを設定します。
alias cdw="cd /var/www/html"
それで、Apacheのホームページディレクトリに行きたいとき、シンボリックリンクのエイリアスと同等でcdw
答えたように入力するだけですか?。
ジャンプを使用して作業ディレクトリをすばやく変更しています。
現在のディレクトリを追加するには:
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
。
alias
ナビゲートに使用します。頻繁にアクセスされるディレクトリが少ない場合は、単にエイリアスを設定します。例えば、
alias e='cd /etc'
alias h='cd /home'
alias al='cd /var/log/apache2/'
それから単に
e
に連れて行きます/etc
。
$CDPATH
たぶん?