cdを使用して複数のディレクトリレベルに移動する


39

多くの場合、深くネストされたフォルダー(/ path / to / project / com / java / lang / whateverなど)になり、時には4つのディレクトリレベルにジャンプできるようにしたいJavaプロジェクトを扱っています。cd ../../../ ..と入力するのは苦痛であり、シンボリックリンクはしたくありません。複数のディレクトリレベルに移動できるcdのフラグがあります(私の頭の中では、cd -u 4のようなものになります)。残念なことに、cdのmanページは特に見当たりませんが、代わりに役に立たない "builtins"ページが表示されます。


1
cd ...「。」の数を解釈するためのbashの変更 上がるレベルの数になります。これは、私が知らない競合を引き起こしますか?

MacOSのためにここに来る人のためにあなたがインストールすることができますzshOh My Zshのより良い代替手段であるbash、その後、あなただけ行うことができcd ...、それがあるべきように(複数のドットを)
ドミニク

回答:


29

または...これを試してください:

..nを使用してディレクトリを上に移動します。

次の例では、.. 4を使用して4つのディレクトリレベルに移動し、.. 3を3つのディレクトリレベルに移動し、.. 2を使用して2つのディレクトリレベルに移動します。

次のエイリアスを.bash_profileに追加して再ログインします。

エイリアス.. = "cd .."

エイリアス..2 = "cd ../ .."

別名..3 = "cd ../../ .."

(等)

ハック#2を参照


10
私はむしろ別名を使用することになり.....そして....、彼らがそうであるように速く入力するのではなく、別名の原理はもちろん同じです。
ベルンハルト

1
@bernhard競合を引き起こすとは思わないので、大歓迎です。ウェブサイトから引用したので、そのまま残しました。
cutrightjm

DOS用4DOS.EXEシェルもサポートcd ...cd ....などそれは非常に便利でした。
Alexios

..... ..実際には2つの文字遅い、速い..4以上ではありません
ライアン

29

エイリアスを使用した単純な関数:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

~/.bashrcすべてのインスタンスで必要な場合は、これを定義できます)。

使い方は簡単です:

$ cd.. 10

良いですね!私のために働く!バッシュ4.3.11
カルロス・ヌニェス

2
いい答えだ; aka は中間ディレクトリではなく、呼び出し前の作業ディレクトリに設定されるため、eval $(printf "cd ..;%.s" $(seq $1))これはcd複数回などのソリューションよりも優れていることを指摘しておくとよいでしょう。PS- 必要に応じて簡素化します。~-$OLDPWDcd $(printf %.s../ $(seq "$1"))
トビースパイト

10

セットアップを必要としない、シンプルでローテクなソリューション。bashただし、-styleコマンド編集のあるシェルでのみ機能します。

  • タイプ cd ..
  • Up-arrow Return必要な回数だけ押します。2本の指を使用すると非常に高速です。

2
ハハ、

8

正解は「cd + n」であることが判明しました。ここで、nは上に上げたいレベルの数です。残念なことに、これはどこにも文書化されていません!


17
少なくともbashでは機能しません。
HongboZhu

5
Debianに同梱されているbash 4.2.25では動作しません。好奇心から、どの* nixやシェルを使用していますか?
アレクシオス

Bashにはdirs[+ n]を引数として受け取り、を介して追加されたn番目の一意のディレクトリを出力する組み込みの呼び出しがありますpushd。あなたがいる場合alias cdpushd、あなたはこれを使用することができます。ただし、これは技術的にはOPの質問に対する答えではないことに注意してください。これは一意のディレクトリに関係しているためです。つまり、同じディレクトリに戻ると、時間が経つにつれて順序が乱れます。
ブライアンピーターソン

うん、pushdそしてpopdまたそれが仕事にできている理由である、[+ n]のオプションを取ります。また、不完全で間接的ですが、これは質問への答えとして使用できると思います。多くの場合、最近あなたの上のディレクトリにアクセスしたので、ディレクトリスタックによって保存された最後の10ディレクトリにあります。
ブライアンピーターソン

私のために働いていませんでした...
Vass

4

関数を書くことができます(シェル自体の状態、つまり作業ディレクトリを変更したいので、関数でなければなりません。外部コマンドはそれ自身のプロセスにのみ影響します)。

これは、物理ディレクトリ構造内で引数として渡されたいくつかのレベル(デフォルトでは1)に上がる関数です(つまりcd -P ..n回)。

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

次のように使用します。

up 4

1
このコードは質問に答えるかもしれませんが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供することで、長期的な価値が向上します。
ドナルドダック

1
同意して、私はいくつかのコメントを追加しました。
mgild

細心の注意を払うために、up 4本当にcd /some/dir/仮定と同等ではありません$PWD = "/some/dir/that/is/deeply/nested/"か?
snapfractalpop

2

ない正確に何を求めているが、あなたはになりますpushdpopd。私はそれらがいくつかのcd...エイリアスよりもフォルダナビゲーションのためにはるかに便利だと思います

いくつかの固定領域を行き来する場合、通常はエイリアスを使用します。

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

エイリアスを使用する代わりに、次のbash関数も使用できます。

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(または1ライナーなど。function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; }

これを~/.bashrcファイルに追加すると、端末で使用できるようになり、../../../../../../呼び出し前の文字列の構築により、cd使用cd -して開始ディレクトリに戻ることができます。

より便利な実装には、ユーザー入力チェックも含まれます。

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}


0

めったに使用されない環境パラメーターを試してくださいCDPATH。次に、レベルを明示的に設定する必要がない場合があります。

例:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

複数のプロジェクトで作業している場合、CDPATH設定をプロジェクト固有の環境ファイルにすることができます。さらに自動化のためにシムでトリガーします。

私はpushdとpopdをかなり頻繁に使用します。私はCDPATHを使用して、プロジェクトのサブディレクトリではなくプロジェクトツリー間を移動する傾向がありますが、現時点では、いくつかの大きなプロジェクトではなく、多くの小さなプロジェクトに取り組んでいます。:)


0

以前にターゲットディレクトリにいる場合:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

DirBを見てください。これは、次のようにしてブックマークを作成できるBASHスクリプトです。

操作

  • sディレクトリブックマークを保存する
  • gブックマークまたは名前付きディレクトリに移動します
  • pブックマーク/ディレクトリをディレクトリスタックにプッシュする
  • r保存したブックマークを削除する
  • dブックマークされたディレクトリパスを表示する
  • slディレクトリのブックマークのリストを出力します

非常にシンプルで非常に効果的です。


0

@Grigoryの答えからさらに一歩進んでください。

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

あれは :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

このまったく同じ問題にうんざりし、結果としてcd-plusを作成することになりました。複数のディレクトリをcdアップできる単一のファイルCLIユーティリティ。

使用法

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/

0

以下のコードをに追加すると、の補完が3プラスドット表記を尊重する.bashrcように拡張されますcd

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

このスニペットがbashシェルで実行されると、入力cd .../およびヒットにより、たとえば2レベル上のすべてのディレクトリ<TAB>へのパスが完成し../../、相対パスがリストされます。

更新:上記のコードで参照されbash-completionている_cdメソッドにアクセスするには、インストールする必要があります。ほとんどのコマンドラインパッケージマネージャーを介してインストール可能

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.