システム管理のために複数のディレクトリを切り替えるための高速なコマンドライン方法は何ですか?つまり、pushd .
とpopd
でトグルしますが、スタックの一番下から恒久的にポップするのではなく、複数を保存して循環させたい場合はどうなりますか?
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/
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
fasd をインストールすることをお勧めします。名前のごく一部を入力するだけで、すでにアクセスしたディレクトリにすばやくジャンプできます。
例:/home/someName/scripts/
にアクセスしたことがある場合は、たとえばz scr
と入力するだけでそこにジャンプできます。履歴スタックなどの順序を覚えておくと便利です。
cd
をどこかに置くと、Bashは古い作業ディレクトリに環境変数$OLDPWD
を格納します。
cd -
は、cd "$OLDPWD"
と同じです。
次のようにディレクトリ間を行き来することができます:
blue$ cd ~/green
green$ cd -
blue$ cd -
green$
これを行うために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つの部屋を切り替えることができます。
私は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.
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 --
を使用して、過去にcd
edした最大10個のディレクトリのリストを表示し、cd -N
(N
はエントリのインデックス)を使用してそこに移動します。
~/.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
私は主に oh-my-zsh プロファイルでZSHを使用します。端末に次の一致を入力できます。
# cd /ho
次に、矢印(上と下)を使用して、上記の文字で始まるエントリのみを示すすべてのシェル履歴を確認できます。たとえば、/home/morfik/Desktop/
および/home/morfik/something/
、非常に高速にディレクトリを切り替えることができます。シェルの履歴にいくつのエントリがあってもかまいませんが、たくさんある場合は、より適切な式を使用してください。つまり、cd /home/morf
そしてここでキーボードの上下矢印キーを押します。
解決策を達成する別の方法もあります。この場合、 tmux および [〜#〜] fzf [〜#〜] を使用する必要があります。次に、ctrl-rなどのホットキーを作成します。これを押すと、現在のウィンドウが分割され、次のように表示されます。
これで、式を使用してリストを検索できます。入力したばかり^cd /media
は、そのフレーズで始まるエントリのみを返します。もちろん、'cd 'home
コマンドとディレクトリ名全体(パスではなく名前のみ)にも一致します。
5個または10個のディレクトリがあり、使用頻度が高く、必ずしも最近使用された5個または10個のディレクトリに関心がない場合は、次のようなコマンドエイリアスを設定します。
alias cdw="cd /var/www/html"
そして、Apacheのホームページのディレクトリに移動するときは、 シンボリックリンクのエイリアスと同等 で答えたように、cdw
と入力します。
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 pushd
、help popd
、help dirs
をご覧ください。そしてもちろん、man iselect
。
ところで、iselect
はおそらくあなたのディストリビューション用にあらかじめパッケージ化されて利用可能です。 DebianやUbuntuなど、おそらく他の人も対象です。
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
を呼び出します。
ナビゲートにはalias
を使用します。頻繁にアクセスされるディレクトリが少ない場合は、エイリアスを設定するだけです。例えば、
alias e='cd /etc'
alias h='cd /home'
alias al='cd /var/log/Apache2/'
その後、単に
e
/etc
。