Menggunakan cd untuk naik beberapa level direktori


39

Saya berurusan dengan proyek-proyek java yang sering mengakibatkan folder sangat bersarang (/ path / ke / project / com / java / lang / apa pun, dll) dan kadang-kadang ingin dapat melompat, katakanlah, 4 level direktori ke atas. Mengetik cd ../../../ .. menyakitkan, dan saya tidak ingin symlink. Apakah ada beberapa flag ke cd yang memungkinkan Anda naik beberapa level direktori (di kepala saya, itu akan menjadi sesuatu seperti cd -u 4)? Sayangnya saya tidak dapat menemukan halaman manual untuk cd secara khusus, alih-alih hanya mendapatkan halaman "bawaan" yang tidak berguna.


1
Memodifikasi bash untuk menafsirkan di cd ...mana jumlah '.' akan menjadi jumlah level untuk naik. Apakah ini akan menyebabkan konflik yang tidak saya sadari?

Bagi mereka yang datang ke sini untuk MacOS Anda dapat menginstal zshdan Oh My Zshyang merupakan alternatif yang lebih baik untuk bashdan kemudian Anda bisa melakukan cd ...(beberapa titik) seperti seharusnya
Dominic

Jawaban:


29

Atau ... coba ini: (yay Google)

Menavigasi direktori menggunakan ..n:

Dalam contoh di bawah ini, ..4 digunakan untuk naik 4 level direktori, ..3 untuk naik 3 level direktori, ..2 untuk naik 2 level direktori.

Tambahkan alias berikut ke .bash_profile dan masuk kembali.

alias .. = "cd .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(dll)

Lihat Retas # 2


10
Saya lebih suka menggunakan alias .., ...dan ....karena mereka lebih cepat mengetik, tetapi prinsip alias tentu saja sama.
Bernhard

1
@ Matthard Anda lebih dari menyambut, karena saya tidak percaya itu akan menyebabkan konflik. Saya hanya membiarkannya apa adanya karena saya mengutipnya dari situs web.
cutrightjm

Shell 4DOS.EXE untuk DOS juga didukung cd ..., cd ....dll. Itu sangat berguna.
Alexios

..... tidak lebih cepat dari ..4, sebenarnya 2 karakter lebih lambat ..
Ryan

29

Fungsi sederhana, dengan alias juga:

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

(Anda dapat mendefinisikan ini ~/.bashrcjika Anda menginginkannya dalam setiap contoh).

Mudah digunakan:

$ cd.. 10

Yang bagus! Bekerja untukku! Bash 4.3.11
Carlos Nunez

2
Jawaban yang bagus; Anda mungkin ingin menunjukkan bahwa ini lebih baik daripada solusi seperti eval $(printf "cd ..;%.s" $(seq $1))yang cdberkali-kali, karena ~-alias $OLDPWDdiatur ke direktori kerja dari sebelum pemanggilan, daripada ke direktori perantara. PS - menyederhanakan cd $(printf %.s../ $(seq "$1"))jika Anda inginkan.
Toby Speight

10

Solusi sederhana, berteknologi rendah yang tidak memerlukan pengaturan apa pun. Hanya bekerja dalam shell dengan bashpengeditan perintah -style.

  • Mengetik cd ..
  • Tekan Up-arrow Returnsebanyak yang diperlukan. Sangat cepat jika Anda menggunakan dua jari.

2
haha, bukan jawaban yang buruk kurasa :)
joshmcode

8

Ternyata jawaban yang benar adalah 'cd + n', di mana n adalah jumlah level yang ingin Anda naikkan. Sayang sekali ini tidak didokumentasikan di mana pun!


17
setidaknya itu TIDAK bekerja di bash.
HongboZhu

5
Tidak berfungsi pada bash 4.2.25 karena dikirimkan bersama Debian. Karena penasaran, * nix dan / atau shell apa yang Anda gunakan?
Alexios

Bash memiliki built-in yang dipanggil dirsyang mengambil [+ n] sebagai argumen, dan mencetak direktori unik ke-n yang ditambahkan melalui pushd. Jika Anda alias cdmau pushd, maka Anda bisa menggunakan ini. Namun, perhatikan bahwa ini secara teknis bukan jawaban untuk pertanyaan OP, karena ini ada hubungannya dengan direktori unik , yang berarti bahwa pesanan akan kacau seiring waktu, ketika Anda kembali ke direktori yang sama.
Brian Peterson

Ya, pushddan popdjuga ambil opsi [+ n], itulah sebabnya itu bisa bekerja. Juga, meskipun tidak sempurna dan tidak langsung, saya kira ini dapat digunakan sebagai jawaban untuk pertanyaan itu. Seringkali Anda mengunjungi direktori di atas Anda baru-baru ini, sehingga direktori tersebut akan berada dalam 10 dir terakhir yang disimpan oleh tumpukan direktori.
Brian Peterson

tidak bekerja untuk saya ...
Vass

4

Anda bisa menulis sebuah fungsi (itu harus fungsi, karena Anda ingin mengubah keadaan shell Anda sendiri, yaitu direktori kerja; perintah eksternal hanya akan memengaruhi prosesnya sendiri).

Berikut adalah fungsi yang akan naik sejumlah level yang dilewati sebagai argumen (default 1) dalam struktur direktori fisik (jadi, seperti cd -P .., n kali):

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'}$;;')/";
}

Gunakan seperti ini:

up 4

1
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
Donald Duck

1
Setuju, saya telah menambahkan beberapa komentar untuk membantu.
mgild

Menjadi nitpicky, tidak up 4benar - benar setara dengan cd /some/dir/asumsi $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop

2

Tidak persis apa yang Anda minta tetapi Anda harus melihat pushddan popd. Saya menemukan mereka jauh lebih berguna untuk navigasi folder daripada beberapa cd...alias

Jika Anda bolak-balik dari beberapa area tetap, hal yang biasa adalah memiliki alias.

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

1

Alih-alih menggunakan alias, Anda juga dapat menggunakan fungsi bash berikut:

function mcd() {
  up=""

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

  cd $up
}

(atau sebagai satu-liner: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

Menambahkan ini ke ~/.bashrcfile Anda akan membuatnya tersedia di terminal Anda dan pembangunan sebuah String ../../../../../../sebelum menelepon cdjuga akan memungkinkan untuk digunakan cd -untuk melompat kembali ke direktori awal.

Implementasi yang lebih bermanfaat juga dapat berisi beberapa pemeriksaan input pengguna:

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

Coba parameter lingkungan yang jarang digunakan CDPATH. Maka Anda mungkin tidak perlu mengatur level secara eksplisit.

Contoh:

$ 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

Jika bekerja pada banyak proyek, Anda dapat membuat pengaturan CDPATH menjadi file lingkungan khusus proyek. Dan picu dengan shim untuk otomatisasi tambahan.

Saya cenderung menggunakan pushd dan popd cukup banyak. Saya cenderung menggunakan CDPATH untuk membiarkan saya melompat di antara pohon-pohon proyek daripada subdirat dalam suatu proyek - tetapi saat ini saya sedang mengerjakan banyak proyek kecil, bukan beberapa proyek besar. :)


0

Jika sebelumnya Anda berada di direktori target:

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

Lihatlah DirB . Ini adalah skrip BASH yang memungkinkan Anda membuat bookmark sebagai berikut:

OPERASI

  • s Simpan bookmark direktori
  • g pergi ke bookmark atau direktori bernama
  • p dorong bookmark / direktori ke tumpukan direktori
  • r hapus bookmark yang disimpan
  • d tampilkan jalur direktori yang ditandai
  • sl cetak daftar bookmark direktori

Sangat sederhana, sangat efektif.


0

Selangkah lebih jauh dari jawaban @ Grigory:

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

Itu adalah :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

Muak dengan masalah yang sama persis ini dan akhirnya menulis cd-plus sebagai hasilnya. Utilitas CLI file tunggal yang memungkinkan Anda membuat banyak direktori.

Pemakaian

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

echo `pwd` # /foo/bar/

0

Menambahkan kode di bawah ini ke .bashrcekstensi Anda akan memperpanjang cduntuk menghormati notasi tiga ditambah titik

_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

Setelah potongan ini dijalankan dalam mengetikkan bash shell Anda cd .../dan memukul <TAB>akan menyelesaikan jalur ke ../../dan daftar jalur relatif dari semua direktori yang dua tingkat di atas, misalnya.

Pembaruan : bash-completionharus diinstal untuk memiliki akses ke _cdmetode yang dirujuk dalam kode di atas. Ini dapat diinstal melalui sebagian besar manajer paket baris perintah

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.