web-dev-qa-db-ja.com

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

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

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

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

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

16
gsthina

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 pushdおよびhelp popdを試してください。 manおよびpushdはbash組み込みコマンドであるため、popdページはありません。

29
Jos

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

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

これらのヒントを一緒に使用すると、cdを使用してディレクトリを移動する際の痛みがはるかに少なくなります。

15
Arronical

ツリーを一度に複数のレベルに移動するには、次の機能を使用できます(拡張バージョンの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}を、そうでない場合は$1を置き換えるため、1と同等です。
  • 最後のcd ..の後にOLDPWDを設定することは、通常のcd -動作を維持することを目的としています。
8
parras

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

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
}

apksから/home/thina/teamsに戻るには

goup  6

使用例を次に示します。

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

私が思いついたもう1つの小さな関数は、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
}
6

UPDATE:autojumpよりもさらに強力なツールがあります: fasd ですが、私はそれをよく知りません。


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

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

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

私が持っているように 言及 別の質問で:

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

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

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

j apks

リストの最上位である限り、パスのどの部分でも機能します。j appよりも何度も行った場合は、.../apks.../appに移動します。

適切にメンテナンスされ、Ubuntu向けに配布されており、jump to childなどのその他の便利な機能を備えているため、独自のスクリプトを使用する代わりに推奨します。

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

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

4

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

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

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

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

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

ZshInstall zsh にはbashにはない素敵な機能がいくつかあります。それらのいくつかは、同じ仕事をする関数を書くことでエミュレートできます。特に、cdの2つの引数の形式を使用すると、類似の名前を持つ別のディレクトリに簡単に変更できます。 /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に移動します。

4
Gilles

エイリアス

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

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

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

3
knub

UnixSEで related の質問にすでに答えたので、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を使用することを覚えている(小さな)痛みがなくなります。

2
Graipher

プッシュおよびポップ

コマンドpushdpopdは私のお気に入りです。 pushdコマンドは、訪問したディレクトリを記憶し、dirsコマンドで表示できます。逆方向にジャンプする準備ができたら、popdを使用して戻ります。

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

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

po ()
{
    popd
}

alias d='dirs'

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

エイリアス

頻繁にアクセスされるディレクトリの別のオプションは、cdまたは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'

これにより、ディレクトリを走査する際の柔軟性が大幅に向上します。 DesktopDocumentsMusicDownloadsなどのように、cd***およびsd***エイリアスを手元に置いておくと非常に便利です。 !

1
tniles

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

  • そもそもcdが深くネストされたディレクトリに移動する必要がないようにパスを調整します。そうすることで、頻繁にアクセスする必要がある場所をすぐに確認できます。これを達成する方法は、symlinksを使用することです:明示的で十分に階層化されたディレクトリをそのまま保持しますが、あなた自身の便宜のためにクイックアクセスリンクを作成します。

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

    次に、cdへの長いパスを入力する代わりに、cd ~/apks、およびcd ../teams(または、この例では~/teams)を使用して戻ります。

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

    • 複数のターミナルウィンドウを使用します。ウィンドウが異なる workspaces にある場合に最適です。
    • 1つのウィンドウで複数のタブを使用します。これは、特定のディレクトリでいくつかのコマンドを実行するのに特に適しています。戻るには、単にターミナルタブを閉じてください。
    • (実際には賢明なIMOではありませんが、完全を期すために:) tmuxのような端末マルチプレクサを使用します。
    • cdsを使用してフォルダーに移動し、そこで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}
    
1
leftaroundabout

魚には、素早く移動するためのいくつかの素晴らしい施設があります。

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

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

0

試してみてください 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の前に行く場所を選択できます。例えば。 /home/data/softwareにcdするために3を入力します。そして、単にENTERを押して何も入力しなければ、終了し、あなたがいた場所に留まります。

    z.luaは、対話型の選択または引数補完のためにfzfもサポートしています。

    fzfとの補完

  • cd ../../..を入力せずに親にすばやく戻る:

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

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

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

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

    ...

    z -bzbにエイリアスすることから始めましょう。

    # 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
skywind3000