/Project/Warnest/docs/
や~/Dropbox/Projects/ds/test/
など、まったく関係のないパスにあるディレクトリを頻繁に切り替えたい。
しかし、いつもcd /[full-path]/
を入力したくありません。以前に機能していたディレクトリに切り替えるショートカットコマンドはありますか?
考えられる1つの解決策は、頻繁に使用されるディレクトリの環境変数をbash
.profile
に追加し、それらの変数を使用してそれらにcd
を追加することです。
しかし、これに対する他の解決策はありますか?
2つのディレクトリを切り替えるだけの場合は、cd -
を使用して前後に移動できます。
シェル変数CDPATH
がbash
にあり、ksh
とcdpath
がzsh
にあります。
CDPATH The search path for the cd command. This is a colon-separated list of directories in which the Shell looks for destination directories specified by the cd command.
だから〜/ .bashrcで設定できます:
export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds
次にcd docs
およびcd test
は、最初に見つかったそのようなディレクトリに移動します。 (つまり、同じ名前のディレクトリが現在のディレクトリに存在する場合でも、CDPATH
は引き続き参照されます。CDPATH
に、指定した名前のサブディレクトリを持つディレクトリがさらに含まれる場合、最初の1つが使用されます。)
他に試してみるとよいのは autojump というツールです。エイリアス(デフォルトではj
)への呼び出しのデータベースを保持し、行きたい場所についてインテリジェントな決定を試みます。たとえば、頻繁に入力する場合:
j ~/Pictures
以下を使用して、ピンチに到達できます。
j Pic
DebianとUbuntuで利用でき、デフォルトでユーザーごとに~/.bashrc
または~/.zshrc
に含まれています。
ディレクトリの数が少ない場合は、pushd
を使用してディレクトリ間をローテーションできます。
# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test
cd -
とは異なり、これは3つ以上のディレクトリで使用できます
Noachの提案に従って、私は今これを使っています:
function pd()
{
if [[ $# -ge 1 ]];
then
choice="$1"
else
dirs -v
echo -n "? "
read choice
fi
if [[ -n $choice ]];
then
declare -i cnum="$choice"
if [[ $cnum != $choice ]];
then #choice is not numeric
choice=$(dirs -v | grep $choice | tail -1 | awk '{print $1}')
cnum="$choice"
if [[ -z $choice || $cnum != $choice ]];
then
echo "$choice not found"
return
fi
fi
choice="+$choice"
fi
pushd $choice
}
使用例:
# same as pushd +1
$ pd 1
# show a Prompt, choose by number
$ pd
0 ~/Dropbox/Projects/ds/test
1 /Project/Warnest/docs
2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs
# or choose by substring match
$ pd
0 /tmp
1 ~/Dropbox/Projects/ds/test
2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test
# substring without Prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp
明らかに、これはスタックを循環するためだけのものであり、新しいパスの追加を処理しません-名前を変更する必要があるかもしれません。
これらのCDを作成するために、bashrcでalias
を使用します。
といった:
alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
この問題を解決するスクリプト(通常はacd_funch.shと呼ばれます)を見つけました。これを使用すると、cd --
と入力して、使用した最後の10個のディレクトリを表示できます。次のようになります。
0 ~/Documents/onedir
1 ~/Music/anotherdir
2 ~/Music/thirddir
3 ~/etc/etc
~/Music/thirddir
に移動するには、単にcd -2
と入力します
注:このスクリプトは、最初にLinuxガゼットの記事で公開されていました。こちらから入手できます。 acd_func.sh-bashのCDを拡張して保持します。訪問したディレクトリ名の表示とアクセス履歴 。
"pushd -n"を使用します(bashを使用する場合)。
〜/ .bashrcに追加:
pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/
その後、
cd ~
はあなたの家です。
cd ~1
は~/Dropbox/Projects/ds/test/
です
cd ~2
は/Project/Warnest/docs/
です
~1
とまったく同じ方法で~2
、~
などを使用できます。
Bashでcdable_vars
Shellオプションを試してください。 shopt -s cdable_vars
でオンに切り替えます。
次に、変数export dir1=/some/path
を設定する必要があります。そして最後にcd dir1
などです。次に、それを~/.bashrc
に入れて固定できます。
ここにはたくさんの良い提案があります。どちらを使用するかは、切り替えるディレクトリの小さな固定リストがあるかどうか、またはより一般的なソリューションを探しているかどうかによって異なります。
それが小さな固定リストである場合は、(Felix Yanが示唆したように)単純なエイリアスを設定するのが最も簡単です。
より一般的なソリューション(つまり、時間の経過とともに変化する多くの異なるディレクトリ)を探している場合は、pushdとpopdを使用します(Uselessが推奨)。個人的には、デフォルトのpushd/popdは使いにくいと感じています。特に、多くのフォルダー間で切り替えを開始する場合はそうです。しかし、私はそれをはるかに簡単にするいくつかの微調整を書きました。以下をbashrcに追加してください:
alias dirs='dirs -v'
pd ()
{
if [ -n "$1" ]; then
pushd "${1/#[0-9]*/+$1}";
else
pushd;
fi > /dev/null
}
pd
(pushd
の短縮形)を使用して、どこにいたかを覚えて新しいフォルダにジャンプします。dirs
を使用します。pd 3
は、ディレクトリ番号3にジャンプします。使用例:
$ PS1='\w\$ ' ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
0 /etc/defaults
1 /tmp
2 ~/Dropbox/Public
3 ~/Documents/spec
4 ~/Documents/data
5 ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
0 ~/Dropbox/Public
1 ~/Documents/spec
2 ~/Documents/data
3 ~
4 /etc/defaults
5 /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
0 /etc/defaults
1 /tmp
2 ~/Dropbox/Public
3 ~/Documents/spec
4 ~/Documents/data
5 ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$
j2 を試してみるよりも悪い結果になる可能性があります。
READMEから:
複雑なディレクトリツリーの周りでcd-ingに多くの時間を費やしていますか?
jは、どこに行ったか、そこに費やした時間を追跡し、実際に使用しているディレクトリにジャンプする便利な方法を提供します。
幅広く使ってお勧めします。
以下は、私がテストした1つのケースで機能するように見え、ディレクトリ名をシンボリックリンクとして〜/ Bookmarksにドロップできます。
mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"
function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }
ccd testdir && echo $PWD
# gives /tmp
私の経験では、シェル内を移動する際の最大のスピードアップは、その履歴検索機能を使用することです。 Bashでは、Ctrl
+ R
を押してコマンドの履歴を逆方向に検索し、何らかのパターンを入力できます。次に、そのパターンが履歴内の以前のエントリ(cd
コマンドまたはその他の操作)と照合され、入力と同時に提案が行われます。 Enterキーを押すだけで、提案されたコマンドが再度実行されます。これはBashではreverse-search-history
と呼ばれ、大好きです。それは私に多くのキーストロークを節約し、私の内部メモリを節約します。
2つの履歴エントリcd ~/Dropbox/Projects/ds/test/
とcd /Project/Warnest/docs/
を区別するために、Drop
やWa
など、コマンドの一部を覚えるだけでよいので、これは良いことです。
私はこれらのエイリアスも使用しています(〜/ .bashrcに追加します):
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
それらと一緒に上位ディレクトリに移動する方がはるかに高速です(ただし、ナビゲーションの半分しか解決されません)。
zsh を使用することをお勧めします。このシェルは、ディレクトリ、ファイル、およびほとんどのcliプログラムのオプションでさえ、非常に優れたTAB補完機能です。
私は何年もそのシェルを使用してきましたが、それがなくなってしまった場合は機能性を見逃してしまいます。 zshのスクリプト作成も非常に楽しいです。毎日役立つ one-liners が多数あるからです。
zshを使用している場合:
cd
と入力する必要はありません。ディレクトリパスを入力するだけです(/foo/bar/baz<Enter>
はcd /foo/bar/baz<Enter>
と等しい)
auto_cd
オプションを設定する必要があります
Tab
キーで短縮パスを展開できます(/u/sh/pi<Tab>
は/usr/share/pixmaps
に展開されます。ファイル名でも機能します)とにかく、絶対にシェルに絶対パスを入力するべきではありません。いつでも使用できます:
soffice /P*/W*/*/mydoc*
の代わりに
soffice /Project/Warnest/docs/mydoc.odt
ディレクトリをすばやく変更するためのかなり良いツールがあります:
xd-eXtra高速ディレクトリチェンジャー http://xd-home.sourceforge.net/xdman.html
少し厄介なのは、ディレクトリをoutputsディレクトリだけとして、bashプロファイルなどにマッピングする必要があることです。
# function to do `cd` using `xd`
# -g turns generalized directory search command processing on
# which improves the whole thing a bit
f()
{
cd `/usr/bin/xd -g $*`
}
次のようなことができます:
# change to /var/log/a* (gives you a list to choose from)
f vla
# to skip the list and go directly to /var/log/Apache2
f vlapach
cdargsは、ディレクトリをブックマークするための最も効率的なツールです。 http://www.youtube.com/watch?v=uWB2FIQlzZg
同じ質問があり、最初に この答え が見つかりました。ユーティリティz( https://github.com/rupa/z )をインストールしました。
Zはcdコマンドから学習し、frecencyの原則(頻繁に&最近)に従ってディレクトリを追跡するため、これはまさにあなたが探しているものです。 。したがって、両方のcdコマンドを一度実行すると、次のように実行できます。
z docs
z ds
/Project/Warnest/docs/
と~/Dropbox/Projects/ds/test/
にそれぞれジャンプします。 zの引数は正規表現であるため、完全なフォルダー名を入力する必要すらありません。
更新(2016):これで [〜#〜] fasd [〜#〜] を使用して、ファジーを許可します最新のディレクトリに基づいて検索します。
このためのツールをRubyで作成しました。 YAMLファイルを使用してプロジェクトを宣言できます。
私はそれについてここに少し記事を書きました: http://jrnv.nl/switching-projects-terminal-quickly/
ソースもGitHubに投稿しました: https://github.com/jeroenvisser101/project-switcher
このために特別に作成された「wcd」アプリもあります(私もそれに参加しているため、cygwinにも移植されています)。ショートカット、dirsのブックマークを作成できます。ワイルドカードもサポートしています。/usr/share/wcdのmanページとドキュメントを読むことは非常に役立つはずです。
Fastcdを試す( https://github.com/frazenshtein/fastcd )訪問したディレクトリをbashから記録するフックを設定します。そして、スクリプトを "j"エイリアスとして設定します。これは、最後にアクセスしたディレクトリを示し、すばやくcd(入力を開始してディレクトリをフィルタリング)する機能を備えています。 「j」エイリアスを作成するには、.bashrcの変更が必要です。
取得ツール
cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd
必要なモジュールをインストールする
pip install --user urwid
Set.shファイルをbashrcに読み込みます
echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc
そしてbashrcを更新する
source ~/.bashrc
次に、コンソールで「j」と入力します
IEEE 1003.1(POSIX)によると、OLDPWD
が作業ディレクトリを変更するたびに、以前の作業ディレクトリで更新する必要がある環境変数cd
もあります(興味深いものについては、80244行目) IEEE 1003.1-2008のページ2506の)。
私は自分のユーティリティ cdhist を使用して、これを長年管理しています。 cdコマンドのエイリアスを作成し、ディレクトリスタックを自動的に保持します。
export
を使用して、ディレクトリパスを変数に割り当て、それらを参照できます。
export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2
anc
は、ディレクトリのブックマークを保持するコマンドラインツール(アンカーの略)です。 (これまでのところbashでのみテスト済み)
あなたの場合:
anc a /Project/Warnest/docs/ ~/Dropbox/Projects/ds/test/
これは両方のディレクトリをアンカー(ブックマークと考えます)リストに追加します
ここで、システムタイプのどこからでも/Project/Warnest/docs/
にジャンプする場合は、次のように入力します。
anc Warn
~/Dropbox/Projects/ds/test/
にジャンプする場合は、次のように入力します。
anc ds test
ブックマークされたパスに対してテキストを照合することとは別に、ancには、ディレクトリを移動するための他の多くの便利な方法があります。
anc i
すべてのブックマークを番号順に一覧表示するインタラクティブモードを開始するため、入力する必要があるのは番号だけです
入力した場合:
anc Pro[TAB]
すべてのブックマーク(この場合は両方のブックマーク)に一致するリストが表示され、矢印キーを使用してリストから選択できます。これは非常に迅速かつ直感的な方法です。
プロジェクトのgithubページでancを取得します: https://github.com/tobimensch/anc
READMEの使用例もあります。
完全な開示:私はこのスクリプトの作成者です。一部の人に役立つと思います。
pushd
とpopd
は先見性を必要とするため、私は好きではありませんでした。それをねじ込んで、最後のいくつかのディレクトリを自分で追跡し、cd-to-old-dirs関数でそれらを使用できるようにします。それをcdo
と呼びます。これをrcファイルに入れます(例:~/.bashrc
):
function precmd() { __path_log; } # to install in zsh, harmless in bash
Prompt_COMMAND="__path_log" # to install in bash, harmless in zsh
# Populate the array DIRHIST with the last 8 dirs visited (not for direct use)
__path_log() {
local d dh first=true
if [ -d "$__DIRHIST" ] && [ "$__DIRHIST" != "$PWD" ]; then
# $__DIRHIST is the last dir we saw, but we miss foo in 'cd foo; cd bar'
# so we use $OLDPWD to catch it; so you'd need a THIRD change to fool us.
for d in "$__DIRHIST" "${DIRHIST[@]}"; do
if [ -n "$first" ]; then unset DIRHIST first; DIRHIST[1]="$OLDPWD"; fi
if [ "$OLDPWD" = "$d" ] || [ "$PWD" = "$d" ] || [ ! -d "$d" ]; then
continue
fi
dh=$((1+${#DIRHIST[@]}))
[ $dh -lt 9 ] && DIRHIST[$dh]="$d" # Push up to 8 directories
done
Elif [ -z "$__DIRHIST" ]; then
DIRHIST[1]="$OLDPWD"
fi
__DIRHIST="$PWD"
}
cdo() {
local d n=0
if [ -z "${DIRHIST[1]}" ] || [ -z "$1" ]; then
cd ${OLDPWD+"$OLDPWD"}
return $?
fi
case "$1" in
ls ) for d in "${DIRHIST[@]}"; do echo "$((n=n+1)) <$d>"; done \
|sed "s:<$HOME:<~:;s:</home/:<~:" |column \
|GREP_COLORS='ms=0;32' grep --color -e '\b[0-9] <' -e '>' ;;
[1-9]) cd "${DIRHIST[$1]}" ;;
* ) [ -d "$1" ] && cd "$1" || echo "Usage: cdo [NUM|ls]" >&2; return 2 ;;
esac
}
次の例では、ハッシュディレクトリdollar(# dir $
)、スタックオーバーフローによりプロンプトが灰色になるため選択されました:
# ~ $ cd /tmp
# /tmp $ cdo
# ~ $ cdo ls
1 </tmp>
# ~ $ cd /
# / $ cdo ls
1 </home/adam> 2 </tmp>
# / $ cdo
# ~ $ cdo ls
1 </> 2 </tmp>
# ~ $ cdo 2
# /tmp $ cd test
# /tmp/test $ cd ../test2
# /tmp/test2 $ cdo ls
1 </tmp/test> 3 </home/adam>
2 </tmp> 4 </>
# /tmp/test2 $ cdo 4
# / $ cd
# ~ $ cdo ls
1 </> 3 </tmp/test>
2 </tmp/test2> 4 </tmp>
他の人たちが私と同じ一般的な考えを持っているのを見るのは本当に素晴らしいです(私は私がオリジナルだったと思いました!)。 @SamTrolimanによる fastcd 、@ nullの xd 、@ phildobbinの j2 への言及はすべて非常によく似ています。 重複した質問84445 も参照してください。これには setopt auto_pushd
。私は今でも自分のコードを好みますが、ymmvです。
必要なのは、基本的にはワークフローのプロジェクトファイルのようです。プログラミングIDEのように、アクティビティに属するディレクトリを使用します。 Zsh Navigation Tools とn-cd
というツールを試してみてください。それはあなたが最後に訪れたフォルダをナビゲートし、またあなたが選んだディレクトリでHotlist
を定義することを可能にします:
n-cd
は、次のキーの組み合わせにバインドできます。
zle -N znt-cd-widget
bindkey "^ T" znt-cd-widget
この状況で使用する解決策はscreen
です。画面を開始し、C-a c
を使用して各ディレクトリのウィンドウを作成し、そこに移動します。 C-a n
またはC-a p
でウィンドウ/ディレクトリを切り替えます。ウィンドウにC-a A
という名前を付けます。次に、C-a "
を使用してウィンドウのリストをポップアップし、ウィンドウ番号または名前を使用して移動できます。 screen
であるため、セッションから切断して作業スペースを節約し、後で同じ設定で再接続できます。
Fish
を使用すると、インタラクティブなシェルがすぐに機能します(fish
> zsh
> bash
)。POSIX
/Bash
for scriptingを使用してください。これは、最も広くサポートされている構文です(POSIX
> Bash
> Zsh
> Fish
)。ここでさまざまなシェルをテストしたことが私のフィードバックです(テスト/採用の順序):
Bash
:Zsh
+ oh-my-zsh
:cd /e/x1
→cd /etc/X11/
);Fish
+ oh-my-fish
(current)は、箱から出してすぐに最高です:すべてのシェルはfunction
とalias
を使用して拡張できます。これは、問題に関連して私が使用するものです(POSIX互換)。
back () { # go to previous visited directory
cd - || exit
}
up () { # go to parent directory
cd ..|| exit
}
基本的ですが、本当に意味がありとても覚えやすく、オートコンプリートがあります。
CDPATH
を設定して、最もよく使用するディレクトリを追加します(例:~/projects/
、/etc/init.d/
)なので、すばやくジャンプできます。
CDPATH
のmroeの詳細については、manatworkの回答 を参照してください。
ここにいくつかの提案:
最も直接的なアイデアは、.profileファイルにエイリアスを追加することです
vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'
次に$ dir1
またはdir2
を使用して、cdできます
常に2つのdirsのみを切り替える場合。 cd -
を使用すると、それらが切り替わります。
そのためのスクリプトを作成しました。これが Githubへのリンク です。
次に使用例を示します。
最初にpev変数を追加しましょう:
$ pev add longpath '/A/very/very/long/path/I/frequently/need' # output: # environment variable "pev_longpath" added successfully. "pev show" to see the list of pev variables.
これまでに定義したpev変数のリストを見てみましょう:
$ pev show # output: | NAMES VALUES | ---------- ---------- | pev_longpath "/A/very/very/long/path/I/frequently/need"
次に、そのディレクトリに移動します。
$ cd $pev_longpath
または、そのサブディレクトリの1つに何かをコピーします。
$ cp somefile $pev_longpath/and/deeper/than/that
実際、pev変数は他の環境変数と何の違いもありません。おそらく管理が簡単です。私はシェルスクリプトの経験があまりないので、遠慮なく私のエラーを教えてください。 HTH。
あなたの基準に基づいて、~/.bashrc
で頻繁に使用されるパスごとにalias
を定義するだけでよいと思います。私はこの方法を個人的に使用しています。
alias taxes='cd /users/bob/documents/home/finances/taxes'
alias elvis='cd /dropbox/2016/files/music/elvis'
関連する質問( link )で述べたように、ディレクトリツリーを下に戻って元に戻りたい場合は、..
が私のお気に入りです。 .. 1つのディレクトリを上に移動して../..
2および../../..
3を移動するなどして、ツリーのブランチ内を簡単に移動できます。同じコマンドを使用して、別のブランチを上下に移動することもできます。 、たとえばcd ../../example
またはcd ../../../example/example
など。ディレクトリ間を行き来する簡単なスイッチの場合、cd -
または$OLDPWD
が最善の策です。
Bashおよびzsh端末での迅速なディレクトリナビゲーションのための断然最良のソリューションは、インストール z-ジャンプ スクリプトです。この必須のスクリプトは、Google Chrome Devtools開発者、Paul Irishの 2013 Fluent基調講演 で推奨されています。私はそれなしでは生きられません。
DESCRIPTION 'frecency'に基づいて、最もよく使用されるディレクトリを追跡します。
短い学習フェーズの後、zは、コマンドラインで指定されたすべての正規表現に順に一致する最も「最新の」ディレクトリに移動します。
例えば、
z foo bar
は/ foo/barに一致しますが、/ bar/fooには一致しません。[...]
Frecencyは「最近」と「頻度」の組み合わせです。
アトミックの作業ディレクトリ(wd)はこれに適したパッケージのようです: https://github.com/karlin/working-directory
2つのbash関数を実装しました。
cdh(cd履歴):最後の9つのディレクトリを自動的に記憶します。番号を入力すると、そのうちの1つに戻ることができます。
cdb(cdブックマーク):現在のディレクトリに任意の文字を割り当て、後でこの文字を入力してこのディレクトリに移動できます。
cdhとcdbはどちらもautocd(別名 "cd witout cd")で動作します。
http://fex.belwue.de/fstools/bash.html を参照してください