CLIを使用して深くネストされたディレクトリにすばやく移動したり、移動したりするにはどうすればよいですか?


16

を使用cd <directory>すると、ディレクトリが存在する場合はそれが開かれることがわかります!

また、cd ..現在の作業ディレクトリから1レベル上に移動します。

しかし、のような長いパスを持つネストされたディレクトリがある場合/home/thina/teams/td/tech/app/release/apks、フォルダに移動するのは面倒でapksあり、また別のノードに戻るのは難しい/home/thina/teams

cdand の入力をスキップする方法はありcd ..ますか?Ubuntu 16.04を使用しています。


うん!cdand の入力をスキップする方法はありcd ..ますか?
gsthina

@GSURENDARTHINA私はあなたがあなたのケースでは例えば、一度に戻って複数のレベルを行くことによって、少なくともいくつかのキーストロークを保存することができます知っていると思いますcd ../../../../..
underscore_d

2
シンボリックリンクはオプションですか?
ポケット

1
またCDPATHbashドキュメントで変数を確認することもできます。
-chepner

気付いていない場合に備えて、現在の作業ディレクトリ内の任意のディレクトリに対して「cd <ディレクトリ>」を実行できます。スラッシュで始めないでください。たとえば、作業ディレクトリが現在「/ home / thina / teams / td / tech / app / release」の場合、「cd apks」と入力するだけです
-jcadcell

回答:


30

あるpushdpopd

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command

お試しhelp pushdhelp popdより多くのオプションのために。and はbash組み込みコマンドmanであるためpushd、ページはありませんpopd


5
cd -同じことをしませんか?
edwinksl

5
@edwinkslはい、しかしpushdpopd以前の複数のパスを思い出すことができます。
ジョス

8
/ コマンドdirs内にディレクトリスタックをリストすることを忘れないでください。pushdpopd
アロニカル

4
これらはbash組み込みコマンドであるため、bash-builtins(7)のマニュアルページで説明されています。(または、bashの完全なマニュアルページにも記載されています)それはあなたが言及した(help pushdおよび)と同じ情報help popdですhelp dirsが、これらのコマンドがどこから来たのか疑問に思っている場合は言及したいと思います。
MT

2
あなたはスペルミス@Joshelp pusdh
Sergiy Kolodyazhnyy

16

すでに提供されている非常に良い答えに加えて、cd効果的に使用するためのヒントを次に示します。

  • cd - 最後にアクセスしたディレクトリに戻ります。
  • cd ../../..一度に3つのレベルを取得します。..一緒に連鎖した表記を使用して、 好きなだけディレクトリを「上に移動」できます。
  • 上に移動する回数がわからない場合はcd ..、を使用してから、矢印キーを押してコマンドを再度使用することでbash履歴を使用します。
  • 使用~ユーザーとしてthinaにログインしている場合は、現在のユーザのホームディレクトリの中に立って、cd ~/teamsに行くことができます/home/thina/teams
  • パスにBashのオートコンプリートを使用します。cdパスセグメントの一部に続けてを入力すると、Tabキーはコマンド内のパスのセクションを完了しますTab。他に有効な選択肢がない場合、そのセグメントは完了します。たとえば、tを入力してcd /home/thina/teams/td/tからを押したTab場合、tdディレクトリに文字tで始まる他のファイルまたはディレクトリが存在しない限り、techという単語が入力されます。

これらのヒントを一緒に使用することで、ディレクトリの移動がcd非常に簡単になります。


2
~特にrootである場合、ポイントに追加すると、~userすぐにuserホームディレクトリに移動します。
CVn

おかげで、気づかなかったので、次の編集で追加します。
アロニカル

9

ツリーを一度に複数のレベルに移動するには、次の機能を使用できます(拡張バージョンのmuruに感謝します)。

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}

その後、次のことができます。

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams

さらに:

  • up引数なしで呼び出すことは、設定されている場合とそれ以外の場合に置換するcd ..ためと同等です${1:-1}$11
  • 最後の後にcd ..通常のcd -動作を維持することを目的としてOLDPWDを設定します。

1
技術的には、これはエイリアスではなく関数です。
Reinierポスト

@ReinierPost:十分です!それに応じて修正しました。
パラス

2
提案:の-gt代わりに>>辞書編集で、文字列として比較します。また、パスを構築する代わりcd ..に、ループで実行しないのはなぜfor i in $(seq "${1:-1}"); cd ..; doneですか?それもif条件を排除できます。
ムル

@muruあなたのgt発言に同意しますが、2番目の提案については、答えの最後の箇条書きを参照してください。私には理にかなっています。
Oliphaunt -モニカ復活

1
@Oliphauntはそれほど難しくありませんOLDPWD。元のパスに設定するだけです。完全なバージョンは次のとおり
muru

7

長いディレクトリ名の場合は、フルパスで変数を使用します。例えば、

APKS="/home/thina/teams/td/tech/app/release/apks"

その後、あなたはちょうどすることができます cd "$APKS"

x個のディレクトリに移動する場合、この関数は .bashrc

goup() # go up x number of dirs
{
  num=$1
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}

あなた/home/thina/teamsから戻るにapks

goup  6

使用例を次に示します。

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 

私が思いついたが、あまり使用されていない別の小さな関数はbookmark関数です。

仕組みは次のとおりです。現在のフォルダーをファイルに保存し、そのファイルの行番号に基づいて特定のディレクトリに移動できます。例:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight

そして、ここに関数自体があります:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}

5

更新::よりもさらに強力なツールがありautojumpますfasdが、私はそれに慣れていません。


誰もautojumpまだ言及していないことに驚いた

コマンドラインから最も頻繁に使用するディレクトリのデータベースを維持することで機能します(ジャンプする前に、まずディレクトリにアクセスする必要があります)。

基本的に@graipherが構築したもので、いくつかの追加オプションがあります。

わたしはきたように述べた別の質問に:

ディレクトリに数回cdした後(1回で十分です):

cd /home/thina/teams/td/tech/app/release/apks

j現在どのディレクトリにいるかに関係なく、ショートカットを使用してすばやく移動できます。

j apks

注意は、それがリストに最高だとして、パスの作品のどの部分を使用していること: j appまたに行くことができます.../apksあなたがするよりも、そこに多くの時間を行った場合.../app

独自のスクリプトを使用する代わりに、Ubuntu向けに適切に管理、配布されているほか、子へのジャンプなど、その他の便利な機能を備えていることをお勧めします。

.../td/tech $ jc apk
.../release/apks $ 

別のツリーの下の他の場所ではなく、に移動しapksました。tdapks


「fasd」の場合は+1。本当に便利です。
トーマス

4

エイリアス

エイリアスを介して直接使用できる、頻繁に使用されるディレクトリのリストがあります。これには、階層の上のディレクトリへのショートカットも含まれます。

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University

今、3レベル上に移動したいとき、入力するだけ....<Enter>です!


私もこれが好きです。なぜなら、最初は「3つのレベルで4つの期間...」と思っていたのに、「ああ、そう...コンピュータ!0、1、2、3!」と思ったからです。:D覚えやすく、便利になり、私も一緒に遊んでみたいと思います。乾杯!
Pスミス


4

を入力する必要がないように、autocdオプションshopt -s autocd)をオンにしますcd。たとえば、2文字のコマンドだけが必要です..、親ディレクトリに移動するにはです。

2つのディレクトリ間を移動している場合cd -、前の作業ディレクトリに移動して、それらを切り替えることができます。このautocdオプションは-実行されませんcd -が、そのエイリアスまたは関数を定義できます。

組み込みのpushdおよびを使用して、スタック上のディレクトリを記憶できますpopd。ビルトインdirsはディレクトリスタックをリストします(dirs -v読みやすいと思います)。

特定のディレクトリのサブディレクトリに頻繁に変更し、これらのサブディレクトリにかなり一意の名前があるCDPATH場合は、変数に追加します。ただし、CDPATH実際に便利な状況を見つけたことは一度もないことに注意してください。

変数をディレクトリ名に設定してから、で変数に変更でき$fooます。

Zshに zshをインストールするは、bashにはない素晴らしい機能がいくつかあります。それらのいくつかは、同じ仕事をする関数を書くことでエミュレートできます。特に、の2引数形式は、cdあなたが便利などから、似た名前を持つ別のディレクトリに変更することができます/home/thina/teams/td/tech/app/release/apks/com.acme/v1、ランニングcd release betaに行きます/home/thina/teams/td/tech/app/beta/apks/com.acme/v1


2

UnixSEの関連する質問ですでに回答したように、これにはz [github]というスクリプトを使用します。

cdしたディレクトリを記憶し、頻度(頻度+最新性)に従ってランク付けし、その名前の一部を使用して記憶されたパスの1つに変更できるようにします。

少なくとも1回ディレクトリにcdした後、次のようにできます。

$ cd ~user/very/long/path/with/many/subfolders/

ただやる:

$ z sub

部分的な名前の一致を使用して機能します(パスにsubという用語を含む他のディレクトリがなく、周波数が高い場合)。

また、最初に通常のcdを試行し、失敗した場合はzを使用するこのような関数を定義しました。

function cd() {
    builtin cd "$1" 2> /dev/null || z "$1" || (echo "cd: File or Directory not found: $1" >&2 && exit 1)
}

これにより、両方の利点が得られます。フォルダーが現在のディレクトリにある場合、または有効なフルパスが指定されている場合は、そこにcdしますが、そうでない場合はデータベース内で一致するものを見つけてそこにcdします。これにより、cdを使用して(データベースをトレーニングし、これまでに行ったことのないフォルダーに移動する)場合によってはzを使用することを覚えている(小さな)痛みがなくなります。


これcdz、頻繁にアクセスするディレクトリのデータベースを構築する方法を妨げないのですか?
左回り

それはどう違いautojumpますか?
シプリアントモイアガ

@leftaroundabout:確かではないが、今のところうまく機能している。zは、組み込みCDを使用するたびにデータベースを確実に構築します(セットアップで最初に試行します)。ただし、zパーツを使用したときにデータベースが更新されるかどうかはわかりません。編集:$ builtin cd〜/ folder / i / have / not / been / to / yet /を実行するときにデータベースが更新されるかどうかをテストしました。そうです。
グレイファー

1
@CiprianTomoiaga実際、基本的に同じことをしているようです。私が使用するcdコマンドの上書きもそのために使用できます。ただし、オートコンプリートのさまざまなコマンドは興味深いようです!
グレイファー

btw:私はzの作者ではありません。とても便利だと思います。
グレイファー

1

私がうまくいくと思う3つのオプションがあります(将来はpushdもっと多く使用するかもしれませんが、私はそれについて学んだだけです):

  • cd最初から深くネストされたディレクトリに移動する必要がないようにパスを配置します。むしろ、頻繁にアクセスする必要のある場所がすぐに使えるようにします。これを実現する方法は、シンボリックリンクを使用することです。明示的で十分に階層化されたディレクトリをそのまま保持しますが、自分の便宜のためにクイックアクセスリンクを作成します。

    ln -s ~/teams/td/tech/app/release/apks ~/apks

    その後、代わりに長いパス入力するのはcd、単に使用cd ~/apks、およびcd ../teams(または、その例preferrableにし、~/teams取り戻すために)。

  • 単一のシェルを使用せず、パス間をcdで行き来しますが、作業する必要があるパスごとに1つのシェルを実行し続けます。このマルチタスクを実現する複数のレベルがあります。

    • 複数のターミナルウィンドウを使用します。ウィンドウが異なるワークスペースにある場合に最適です。
    • 1つのウィンドウで複数のタブを使用します。これは、特定のディレクトリでいくつかのコマンドを実行するのに特に適しています。戻るには、単にターミナルタブを閉じてください。
    • (実際には賢明なIMOではありませんが、完全を期すために:)などの端末マルチプレクサを使用しtmuxます。
    • 単一の目的のコマンドでアクションを起動cdして、フォルダーに移動し、そこで1つのことを行い、すぐに元のフォルダーの制御を返します。

      $ cd /home/thina/teams/td/tech/app/release/apks
      $ some_command this_file_here
      $ cd ../../../../..

      単にワンライナーを行う

      $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here)

      または同等に

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
  • cd まったくしない、ホームディレクトリからコマンドを実行するだけです。ブレースの展開はここで非常に役立ちます:代わりに

    $ cd /home/thina/teams/td/tech/app/release/apks
    $ some_command this_file_here other_file_also_apks
    $ cd ../../../../..

    できるよ

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}

pushdは非常に非常に便利です。あなたの答えをより良くするためにそれをどのように使用するかについての情報を追加したいかもしれません。
セルギーコロディアズニー

@セルグ:はい、しかし、私自身は上記のJosの答えからのみプッシュされたことを知っています。
左回り約

ああ、わかりました。さて、それはその後の答えに役立つかもしれません。
セルギーKolodyazhnyy

1

プッシュおよびポップ

コマンドpushdpopdは私のお気に入りです。pushdコマンドはコマンドで表示できるあなたが訪問したディレクトリを、覚えているでしょうdirs、そしてあなたはジャンプする準備ができたら、後方には、使用popd戻ります。

次に、bash関数とエイリアスを使用した例を示します。

sd ()
{
    pushd "$1" > /dev/null
}

po ()
{
    popd
}

alias d='dirs'

これらのコマンドをさまざまな方法で常に使用しています。

エイリアス

頻繁にアクセスされるディレクトリの別のオプションは、単にcdor pushdコマンドをエイリアス化することです。だから、あなたの投稿から例を使用して:

alias cdapks='cd /home/thina/teams/td/tech/app/release/apks'
alias cdteams='cd /home/thina/teams'

組み合わせ

2つのアイデアを組み合わせると、次のようになります。

alias sdapks='sd /home/thina/teams/td/tech/app/release/apks'
alias sdteams='sd /home/thina/teams'

これにより、ディレクトリを走査する際の柔軟性が大幅に向上します。私は続けるcd***sd***のようなもののために手にエイリアスをDesktopDocumentsMusicDownloads、など、それは非常に便利です!


1

z.luaを試してください-習慣を学習することにより、より速くナビゲートするのに役立つ新しいcdコマンド。

  • fooを含むディレクトリへのcd:

    z foo
  • fooで終わるディレクトリへのcd:

    z foo$
  • 複数の引数を使用します。

    次のデータベースを想定します。

    10   /home/user/work/inbox
    30   /home/user/mail/inbox

    "z in"/home/user/mail/inboxより高い重みのエントリとしてcdします。ただし、z.luaに複数の引数を渡して、別のエントリを優先させることができます。上記の例で"z w in"は、ディレクトリをに変更し/home/user/work/inboxます。

  • インタラクティブな選択を含むcd:

    複数の一致が見つかった場合、を使用z -iするとリストが表示されます。

    $ z -i soft
    3:  0.25        /home/data/software
    2:  3.75        /home/skywind/tmp/comma/software
    1:  21          /home/skywind/software
    > {CURSOR}

    次に、番号を入力し、実際のcdの前に行く場所を選択できます。例えば。cdに3を入力し/home/data/softwareます。そして、単にENTERを押して何も入力しなければ、終了し、あなたがいた場所に留まります。

    z.luafzfインタラクティブな選択または引数補完もサポートしています:

    fzfで完了

  • 入力せずに高速で親に戻るcd ../../..

    新しいオプション"-b"は、「cd ../../ ..」を冗長に入力する代わりに、bashの特定の親ディレクトリにすばやく戻ることができます。

    • (引数なし)cdプロジェクトルートに、プロジェクトルートに.git/ .hg/が含ま.svnれる最も近い親ディレクトリ。

    • (1つの引数)cdキーワードで始まる最も近い親に、見つからない場合は、キーワードを含む親に移動します。

    • (2つの引数):最初の値を(現在のパスの)2番目の値に置き換えます。

    ...

    のエイリアスz -bから始めましょうzb

    # go all the way up to the project root (in this case, the one that has .git in it)
    ~/github/lorem/src/public$ zb
      => cd ~/github/lorem
    
    # cd into to the first parent directory named g*
    ~/github/vimium/src/public$ zb g
      => cd ~/github
    
    # substitute jekyll with ghost
    ~/github/jekyll/test$ zb jekyll ghost
      => cd ~/github/ghost/test

それがあなたのニーズに合うことを望みます。


0

魚には、すばやく移動するための便利な機能がいくつかあります。

  • cd右矢印Enterと入力すると、最新のcdが繰り返されます。
  • cd上矢印右矢印Enterを使用して、2番目に新しいcdを繰り返します。
  • 等。
  • prevdとnextdがあり、しばしばpushdとpopdよりも使いやすいです。

また、お気に入りのディレクトリを〜/ fにシンボリックリンクしているため、〜/ f / xをcdして〜/ foo / bar / baz / experimental-dataにアクセスできます。


0

頻繁にアクセスするディレクトリにエイリアスを長い間使用していました。

また、ccb(create cd bat fileの略-これはdos / windowsに由来し、.batシェルスクリプトccb.batは現在のディレクトリにジャンプするための別の.batファイルを作成します)エイリアスを作成/追加します(.bash_aliasesファイル内)を現在のディレクトリに移動します。

例:$ ccb myfavは、.bash_aliasesファイルのエイリアスmyfavを使用して現在のディレクトリのエイリアスを作成し、.bashrcファイルを取得して、エイリアスがすぐに利用できるようにします。

新しいソリューションを見つけました。それはバッシュ関数です

## USAGE : lj <your_dir>
### lj -- short for LongJump -- (kinda similar to a C function which would jump to an address outside of your current function)
function lj() {
        pushd `find . -type d -name $1 -print | head -n 1`
}

$ lj deeply_nested_dir_name

これは、以前の使用法から何も学ぶ必要はありません。これで解決できない問題は、サブディレクトリツリーに「deeply_nested_dir_name」という名前のディレクトリが複数ある場合、findで見つかったディレクトリの1番目にジャンプすることです。

また、このソリューションは他のディレクトリツリーに移動できません。

ハードコーディングされたエイリアスと生成されたエイリアスとこの新しいlj()関数の間で、私のニーズのほとんどが処理されます。

使用したい人のための私のccb()bash関数は次のとおりです

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.