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.

Tossrock
sumber
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

cutrightjm
sumber
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
Grigory K
sumber
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.
Tom Zych
sumber
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!

Tossrock
sumber
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
mgild
sumber
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'
Homolka yang kaya
sumber
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
}
Siapa peduli
sumber
0

Apakah Anda tahu tentang autojump ? Ini peretasan pihak ketiga, tetapi bisa berguna dalam skenario Anda.

AnonymousLurker
sumber
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. :)

JezC
sumber
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 % 
masm
sumber
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.

Rseal
sumber
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
qun
sumber
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/
Kevin S Lin
sumber
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

Berikan Humphries
sumber