Pertanyaan Menggunakan cd untuk naik beberapa tingkat direktori


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


26
2017-07-16 19:36


asal


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


Jawaban:


Atau ... coba ini: (yay Google)

Jelajahi direktori menggunakan ..n:

Pada contoh di bawah ini, .. 4 digunakan untuk naik 4 level direktori, ..3 ke   naik 3 tingkat direktori, ..2 naik 2 tingkat direktori.

Tambahkan alias berikut ke .bash_profile dan masuk kembali.

alias .. = "cd .."

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

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

(dll)

Lihat Peretasan # 2


23
2017-07-16 20:20



Saya lebih suka menggunakan alias .., ... dan .... karena mereka lebih cepat untuk mengetik, tetapi prinsip alias sama saja. - Bernhard
@bernhard Anda lebih diterima, karena saya tidak percaya itu akan menyebabkan konflik apa pun. Saya hanya meninggalkannya apa adanya karena saya mengutipnya dari situs web. - cutrightjm
Shell 4DOS.EXE untuk DOS juga didukung cd ..., cd .... dll. Itu sangat berguna. - Alexios


Fungsi sederhana, dengan alias juga:

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

(Anda bisa menentukan ini ~/.bashrc jika Anda menginginkannya di setiap contoh).

Sangat mudah digunakan:

$ cd.. 10

19
2017-10-01 05:31



Bagus sekali! Bekerja untukku! Bash 4.3.11 - Carlos Nunez
Jawaban yang bagus; Anda mungkin ingin menunjukkan bahwa ini lebih baik daripada solusi seperti eval $(printf "cd ..;%.s" $(seq $1)) yang cd beberapa kali, karena ~- aka $OLDPWD diatur ke direktori kerja dari sebelum permintaan, daripada ke direktori perantara. P.S. - itu menyederhanakan cd $(printf %.s../ $(seq "$1")) jika kamu mau. - Toby Speight


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


8
2017-10-25 21:31



setidaknya itu TIDAK bekerja di bash. - HongboZhu
Tidak berfungsi pada bash 4.2.25 seperti yang dikirimkan dengan Debian. Karena penasaran, apa yang * nix dan / atau shell yang Anda gunakan? - Alexios
Bash memiliki built-in yang disebut dirs yang mengambil [+ n] sebagai argumen, dan mencetak direktori unik ke-n yang ditambahkan melalui pushd. Jika kamu alias  cd untuk pushd, maka Anda bisa menggunakan ini. Namun, perhatikan bahwa ini tidak secara teknis merupakan jawaban atas pertanyaan OP, karena ini ada hubungannya dengan unik direktori, artinya urutan menjadi kacau seiring waktu, ketika Anda kembali ke direktori yang sama. - Brian Peterson
Ya, pushd dan popd juga mengambil opsi [+ n], itulah mengapa itu bisa bekerja. Juga, meskipun itu tidak sempurna dan tidak langsung, saya kira ini dapat digunakan sebagai jawaban atas pertanyaan itu. Seringkali Anda mengunjungi direktori di atas Anda baru-baru ini, sehingga mereka akan berada di 10 direktori terakhir yang disimpan oleh tumpukan direktori. - Brian Peterson
tidak bekerja untukku ... - Vass


Solusi sederhana berteknologi rendah yang tidak memerlukan penyetelan apa pun. Hanya bekerja dalam cangkang dengan bashmengedit perintah-gaya, meskipun.

  • Mengetik cd ..
  • tekan Panah atas  Kembali sebanyak yang dibutuhkan. Sangat cepat jika Anda menggunakan dua jari.

5
2017-11-20 14:40



haha, bukan jawaban yang buruk kurasa :) - joshmcode


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

Berikut adalah fungsi yang akan naik sejumlah tingkat yang dilewatkan sebagai argumen (default 1) dalam fisik struktur direktori (jadi, suka cd -P .., n waktu):

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  # equivalent to "cd -P ../../../.."

3
2018-03-13 15:41



Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan mengenai mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya. - Donald Duck
Setuju, saya telah menambahkan beberapa komentar untuk membantu. - mgild
Menjadi rewel, tidak up 4 benar-benar setara dengan cd /some/dir/ asumsi $PWD = "/some/dir/that/is/deeply/nested/"? - snapfractalpop


Tidak persis apa yang Anda minta tetapi Anda harus melihatnya pushd dan popd. Saya menemukan mereka jauh lebih berguna untuk navigasi folder dari beberapa cd... alias

Jika Anda akan 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'

2
2017-10-25 22:03





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 Anda ~/.bashrc file akan membuatnya tersedia di terminal Anda dan pembangunan String ../../../../../../ sebelum menelepon cd juga akan memungkinkan untuk digunakan cd - untuk 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
}

1
2017-08-12 08:10