Sử dụng cd để tăng nhiều cấp thư mục


39

Tôi đang xử lý các dự án java thường dẫn đến các thư mục lồng nhau sâu (/ path / to / project / com / java / lang / anything, v.v.) và đôi khi muốn có thể nhảy, giả sử, 4 cấp độ thư mục trở lên. Nhập cd ../../../ .. là một nỗi đau và tôi không muốn liên kết tượng trưng. Có một số cờ cho cd cho phép bạn tăng nhiều cấp độ thư mục (trong đầu tôi, nó sẽ giống như cd -u 4)? Thật không may, tôi không thể tìm thấy bất kỳ trang man nào cho cd, thay vào đó chỉ là trang "nội dung" vô dụng.


1
Sửa đổi bash để diễn giải cd ...số '.' sẽ là số cấp để đi lên. Điều này sẽ gây ra một cuộc xung đột mà tôi không biết?

Đối với những người đến đây cho MacOS, bạn có thể cài đặt zshOh My Zshđây là cách thay thế tốt hơn bashvà sau đó bạn có thể thực hiện cd ...(nhiều dấu chấm) giống như vậy
Dominic

Câu trả lời:


29

Hoặc ... thử cái này: (yay Google)

Điều hướng lên thư mục bằng cách sử dụng ..n:

Trong ví dụ dưới đây, ..4 được sử dụng để tăng 4 cấp thư mục, ..3 để tăng 3 cấp thư mục, ..2 để tăng 2 cấp thư mục.

Thêm bí danh sau vào .bash_profile và đăng nhập lại.

bí danh .. = "cd .."

bí danh ..2 = "cd ../ .."

bí danh ..3 = "cd ../../ .."

(v.v.)

Xem Hack # 2


10
Tôi thà sử dụng các bí danh .., .......vì chúng nhanh hơn để gõ, nhưng nguyên tắc của các bí danh là tất nhiên.
Bernhard

1
@bernhard Bạn được chào đón nhiều hơn, vì tôi không tin rằng nó sẽ gây ra bất kỳ xung đột nào. Tôi chỉ để nó như là vì tôi đã trích dẫn nó từ trang web.
cutrightjm

Trình bao 4DOS.EXE cho DOS cũng được hỗ trợ cd ..., cd ....v.v ... Nó rất tiện dụng.
Alexios

..... không nhanh hơn ..4, thực tế là chậm hơn 2 ký tự ..
Ryan

29

Một hàm đơn giản, với một bí danh, quá:

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

(Bạn có thể định nghĩa điều này trong ~/.bashrcnếu bạn muốn nó trong mọi trường hợp).

Thật đơn giản để sử dụng:

$ cd.. 10

Đẹp quá Làm việc cho tôi! Bash 4.3.11
Carlos Nunez

2
Câu trả lời tốt; bạn có thể muốn chỉ ra rằng đây là tốt hơn so với các giải pháp như eval $(printf "cd ..;%.s" $(seq $1))đó cdnhiều lần, bởi vì ~-aka $OLDPWDđược thiết lập để thư mục làm việc kể từ trước khi gọi, chứ không phải là một thư mục trung gian. PS - nó đơn giản hóa cd $(printf %.s../ $(seq "$1"))nếu bạn muốn.
Toby Speight

10

Một giải pháp đơn giản, công nghệ thấp không cần thiết lập. Tuy nhiên, chỉ hoạt động trong shell với bashchỉnh sửa lệnh -style.

  • Kiểu cd ..
  • Nhấn Up-arrow Returnnhiều lần nếu cần. Rất nhanh nếu bạn sử dụng hai ngón tay.

2
haha, tôi đoán không phải là một câu trả lời tệ :)
joshmcode

8

Hóa ra câu trả lời đúng là 'cd + n', trong đó n là số cấp bạn muốn tăng. Quá tệ điều này không được ghi nhận ở bất cứ đâu!


17
ít nhất là nó KHÔNG hoạt động trong bash.
HongboZhu

5
Không hoạt động trên bash 4.2.25 như được gửi cùng với Debian. Vì tò mò, bạn đang sử dụng * nix và / hoặc shell nào?
Alexios

Bash có một lệnh gọi tích dirshợp lấy [+ n] làm đối số và in thư mục duy nhất thứ n được thêm vào thông qua pushd. Nếu bạn alias cdđến pushd, sau đó bạn có thể sử dụng này. Tuy nhiên, lưu ý rằng đây không phải là câu trả lời về mặt kỹ thuật cho câu hỏi của OP, bởi vì điều này phải thực hiện với các thư mục duy nhất , có nghĩa là thứ tự bị rối theo thời gian, khi bạn quay lại cùng thư mục.
Brian Peterson

Vâng, pushdpopdcũng có một tùy chọn [+ n], đó là lý do tại sao nó có thể hoạt động. Ngoài ra, mặc dù nó không hoàn hảo và gián tiếp, tôi đoán điều này có thể được sử dụng như một câu trả lời cho câu hỏi. Thường thì bạn đã truy cập các thư mục phía trên bạn gần đây, vì vậy chúng sẽ nằm trong 10 thư mục cuối được lưu trữ bởi ngăn xếp thư mục.
Brian Peterson

đã không làm việc cho tôi ...
Vass

4

Bạn có thể viết một hàm (nó phải là một hàm, vì bạn muốn thay đổi trạng thái của chính shell của mình, cụ thể là thư mục làm việc; một lệnh bên ngoài sẽ chỉ ảnh hưởng đến quá trình của chính nó).

Đây là một hàm sẽ tăng một số cấp được truyền dưới dạng đối số (mặc định 1) trong cấu trúc thư mục vật lý (vì vậy, như cd -P .., n lầ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'}$;;')/";
}

Sử dụng nó như thế này:

up 4

1
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
Vịt Donald

1
Đồng ý, tôi đã thêm một vài bình luận để giúp đỡ.
mgild 13/03/2017

Để được nitpicky, không up 4thực sự tương đương với cd /some/dir/giả định $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop

2

Không chính xác những gì bạn đang yêu cầu nhưng bạn nên xem xét pushdpopd. Tôi thấy chúng hữu ích hơn nhiều cho việc điều hướng thư mục so với một số cd...bí danh

Nếu bạn đang đi lại từ một vài khu vực cố định, điều thông thường là có bí danh.

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

1

Thay vì sử dụng bí danh, bạn cũng có thể sử dụng hàm bash sau:

function mcd() {
  up=""

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

  cd $up
}

(hoặc dưới dạng một lớp lót function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; }:)

Thêm phần này vào ~/.bashrctệp của bạn sẽ làm cho nó có sẵn trong thiết bị đầu cuối của bạn và việc xây dựng Chuỗi ../../../../../../trước khi gọi cdcũng sẽ giúp bạn có thể sử dụng cd -để quay lại thư mục bắt đầu.

Một triển khai hữu ích hơn cũng có thể chứa một số kiểm tra đầu vào của người dùng:

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

Hãy thử tham số môi trường hiếm khi được sử dụng CDPATH. Sau đó, bạn có thể không phải thiết lập mức độ rõ ràng.

Thí dụ:

$ 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

Nếu làm việc trên nhiều dự án, bạn có thể đặt cài đặt CDPATH thành tệp môi trường cụ thể của dự án. Và kích hoạt nó với một shim cho tự động hóa bổ sung.

Tôi có xu hướng sử dụng Pushd và popd khá nhiều. Tôi có xu hướng sử dụng CDPATH để cho phép tôi nhảy giữa các cây dự án thay vì các nhánh con trong một dự án - nhưng hiện tại tôi đang làm việc với rất nhiều dự án nhỏ, không phải là một vài dự án lớn. :)


0

Nếu trước đây bạn đang ở trong thư mục đích:

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

Hãy xem DirB . Đó là tập lệnh BASH cho phép bạn tạo dấu trang như sau:

HOẠT ĐỘNG

  • s Lưu một bookmark thư mục
  • g đi đến một dấu trang hoặc thư mục được đặt tên
  • p đẩy một bookmark / thư mục lên ngăn xếp dir
  • r xóa bookmark đã lưu
  • d hiển thị đường dẫn thư mục được đánh dấu
  • sl in danh sách đánh dấu thư mục

Rất đơn giản, rất hiệu quả.


0

Bước xa hơn từ câu trả lời của @ Grigory:

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

Đó là :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

Tôi phát ốm với chính xác vấn đề này và kết quả là đã viết cd-plus . Một tiện ích CLI tập tin duy nhất cho phép bạn cd lên nhiều thư mục.

Sử dụng

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

echo `pwd` # /foo/bar/

0

Thêm mã dưới đây vào của bạn .bashrcsẽ mở rộng cdhoàn thành để tôn vinh ký hiệu ba dấu chấm cộng

_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

Khi đoạn mã này được chạy trong phần gõ bash shell của bạn cd .../và việc đánh <TAB>sẽ hoàn thành đường dẫn đến ../../và liệt kê các đường dẫn tương đối của tất cả các thư mục tăng hai cấp, chẳng hạn.

Cập nhật : bash-completionphải được cài đặt để có quyền truy cập vào _cdphương thức được tham chiếu trong đoạn mã trên. Nó có thể cài đặt thông qua hầu hết các trình quản lý gói dòng lệnh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.