Bagaimana saya bisa berubah ke direktori sebelumnya daripada naik?

214

Saat ini saya menghabiskan banyak waktu kerja saya bergerak bolak-balik antara dua jalur yang sangat jauh di bawah pohon dan beralih dari satu sama lain di root. Itu mengejutkan saya bahwa hidup saya akan jauh lebih mudah jika ada argumen untuk cdyang membawa pengguna ke direktori terakhir mereka.

Yaitu, jika saya di:

/etc/foo/bar/baz/moo

lalu ketik:

cd /var/lib/fubarred_app/blargh/logs

Saya ingin dapat kembali ke direktori pertama tanpa harus mengetikkan seluruh path lagi.

Kunci memori tidak memotongnya karena saya menggunakan cukup perintah di setiap tempat yang sama sulitnya untuk kembali dan menemukan jalur yang saya inginkan seperti juga mengetiknya sendiri.

Apakah ada perintah singkat yang akan membiarkan saya pergi ke direktori sebelumnya?

Yitzchak
sumber
8
di samping jawaban luar biasa dari bryan , Anda dapat mempertimbangkan untuk membuat sepasang alias untuk setiap jalur sehingga Anda dapat mengetikkan sesuatu seperti: " bazmoo" atau " blarghlog" saat diminta :)
warren
4
Mengapa Anda tidak menggunakan layar GNU saja ?
Shi
2
Shell yang mana? itu membuat perbedaan besar.
Randal Schwartz
@warren ditto. itulah cara yang saya sukai untuk melakukan semuanya. setengah dari apa yang saya gunakan untuk komputer saya memiliki alias sendiri sekarang ... =)
ixtmixilix
Fasd luar biasa. Saksikan berikut ini.
majkinetor

Jawaban:

301

Perintah

cd -

akan melakukan swap yang Anda butuhkan pada sebagian besar shell utama, varian yang lebih lama adalah

cd "$OLDPWD"

yang akan menggunakan variabel lingkungan yang berisi direktori kerja sebelumnya.


The man page POSIX untukcd menyebutkan:

DESKRIPSI

Jika, selama pelaksanaan langkah-langkah di atas, variabel lingkungan PWD berubah, variabel lingkungan OLDPWD juga harus diubah ke nilai direktori kerja lama (yaitu direktori kerja saat ini segera sebelum panggilan ke cd).

Operan

  -   Ketika tanda hubung digunakan sebagai operan, ini harus setara dengan perintah:

cd "$OLDPWD" && pwd 

yang berubah ke direktori kerja sebelumnya dan kemudian menulis namanya.

Bryan
sumber
7
Ingat ini sangat tergantung pada shell yang Anda gunakan, dan karena Anda tidak menentukan, akan sulit untuk memberikan jawaban "portabel" yang tidak ada.
Randal Schwartz
16
@ Randall, Mungkin Anda bisa menggabungkan semua komentar shell Anda menjadi satu jawaban Voltron-Shell.
hyperslug
@Rallall. Saya menggunakan bash. Ia bekerja di ksh dan zsh juga. Ngomong-ngomong, saya pertama kali belajar program dari Learning Perl edisi 1994 jadi permisi sementara saya sedikit fanboy. :)
Yitzchak
Hmm, saya gunakan cd $OLDPWDuntuk ini. Sangat menyenangkan bahwa shell utama menawarkan bentuk yang jauh lebih pendek.
ulidtko
2
rasa tertentu @sinni lakukan memiliki pushd, dan setidaknya itu adalah builtin di bash.
slhck
105

Selain jawaban bryan, itu layak disebut ada juga pushddan popd, yang membangun direktori seperti tumpukan. Ini juga tersedia di Windows NT; namun, ini tidak tersedia di semua shell.

Sebagai contoh, kita dapat pergi ke tiga direktori berbeda, dan Anda akan selalu melihat tumpukan Anda saat menelepon pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

Dan ketika Anda menelepon popdtiga kali berturut-turut, Anda mendapatkan ke direktori-direktori dalam tumpukan dengan urutan terbalik. Pada saat yang sama, tumpukan akan dikosongkan lagi.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Jika Anda menggunakan Zsh; ia memiliki opsi AUTO_PUSHD, yang secara otomatis akan mendorongnya cdke tumpukan.

slhck
sumber
pushd dan popd tidak tersedia di semua shell.
Randal Schwartz
5
@ Wiesław: Benarkah? Saya berharap bash punya itu ... Tentu saja, saya bisa alias cduntuk pushd, dan sebagian besar akan sama.
Chris Charabaruk
3
Atau alias pd untuk mendorong dan memiliki keduanya. BTW pushd (atau pd, jika Anda alias) dengan sendirinya menukar direktori saat ini dan direktori yang didorong terakhir, pada dasarnya mencapai apa yang 'cd -' lakukan.
JRobert
Saya suka konsepnya tetapi tidak pernah terbiasa dengan mereka.
Thorbjørn Ravn Andersen
13

Ada beberapa program "lompat"

  • autojump (dikelola dengan fitur dasar)
  • j2 (tampaknya tidak dirawat dengan beberapa fitur canggih)
  • z (versi "j" yang dipertahankan dengan fitur-fitur canggih)

Ini memudahkan segala jenis navigasi direktori. Anda menggunakannya dengan memberikan sebagian dari jalan dan hanya berfungsi.

Dalam kasus Anda

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Anda dapat menetapkan huruf apa saja yang Anda inginkan untuk program ini, "j" adalah tradisi :)

j2 dan z mendukung beberapa istilah pencarian, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... dan lebih banyak opsi.

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank
hayalci
sumber
2
"j" jelas khusus untuk shell. Anda tidak mengatakan itu.
Randal Schwartz
3
@Randal: Bagaimana spesifikasinya shell? Itu sebuah program.
Fixee
3
Saya seorang idiot. :) Saya melihatnya sekarang.
Randal Schwartz
10

Selain cd -dancd $OLDPWD

Anda dapat menggunakan pencarian riwayat dengan menekan CTRL-Rdan mengetik beberapa huruf dari cdperintah yang Anda masukkan sebelumnya. Menekan CTRL-Rberulang kali akan menghasilkan kecocokan yang lebih lama.

Metode ini akan lebih bermanfaat jika Anda memiliki lebih dari dua jalur untuk diubah.

musa
sumber
1
CTRL-R belum tentu membantu. Anda mungkin telah berada di / some / obscure / direktori / deep dan selesai "cd evendeeperdir" kemudian pergi ke ~ / somehere / berbeda.
justintime
1
Bagus! Ini bekerja untuk hal lain selain cd, sangat membantu!
Niloct
9

Anda dapat menggunakan ini untuk dengan mudah membuat alias untuk direktori:

a() { alias $1=cd\ $PWD; }

a 1

dan kemudian:

1
Tuan Contoh
sumber
1
Hanya di shell yang mengerti alias dan fungsi. Tidak semuanya.
Randal Schwartz
jadi ini lompatan mengetik alias =bagian? hmmmm
Xen2050
6

bashmarks akan memungkinkan Anda menandai serangkaian folder dan beralih di antara mereka dengan penyelesaian tab:

Untuk mem-bookmark folder, cukup buka folder itu, lalu bookmark seperti ini:

bookmark foo

Bookmark akan diberi nama "foo". Saat Anda ingin kembali ke folder itu gunakan:

go foo

Untuk melihat daftar bookmark:

bookmarksshow

Pekerjaan penyelesaian tab, untuk membuka bookmark shoobie, cukup:

go sho[tab]
Handyman5
sumber
4

Kemungkinan lain adalah membiarkan dua jendela tetap terbuka, dengan satu posisi pada setiap direktori.

Aljazair
sumber
Tidak ada riwayat bersama, jika Anda menggunakan / mengedit perintah sebelumnya secara teratur (mungkin reset akan mendapatkannya ...?)
Xen2050
@ Xen2050 Lihat opsi shell share_historydi zsh.
Radon Rosborough
4

Saya tahu ini bukan jawaban yang tegas untuk pertanyaan Anda, tetapi membantu dalam mencapai tujuan membawa Anda ke direktori penting Anda .

di setiap keturunan UNIX-bash Anda dapat menggunakan CDPATH untuk memperluas folder yang dicari oleh perintah cd.

dari file .bashrc saya:

export CDPATH='.:~/source/'

cd pertama mencari di folder Anda saat ini, kemudian mencari di direktori proyek-coding saya.

cd myproject

.. membawa saya ke ~ / sources / myproject dari tempat saya berada saat ini.

Fitur kecil sederhana yang telah banyak membantu navigasi direktori saya.

phareim
sumber
1
+1 Ini menambahkan folder CDPATH ke daftar cdautocomplete (TAB), yang bagus. Tetapi jika .tidak termasuk dan jika ada folder di folder CDPATH dengan nama yang sama dengan yang ada di direktori Anda saat ini, maka cd samenameakan pergi ke direktori CDPATH dan bukan yang ada di direktori saat ini, yang buruk. Harus digunakan cd ./samenameuntuk masuk ke folder dup.
Xen2050
Ya, komentar yang bagus. Selalu sertakan yang pertama . , atau Anda akan mengalami hal-hal aneh.
phareim
3

Yup, cd -adalah cara untuk pergi tetapi saya khawatir tentang kurangnya kekuatan yang Anda miliki di shell Anda. popddan pushdjuga bagus, dan jbenda itu juga terlihat bagus.

Saya akan membuang utilitas saya sendiri ke atas ring ... itu hanya sesuatu yang telah saya bangun, menyesuaikan dan bermigrasi dengan saya selama 10 tahun terakhir dan berfungsi dengan baik untuk apa yang saya inginkan.

Posting blog untuk utilitas manajemen direktori saya

Jika itu bekerja untuk Anda, maka hebat, tetapi jika tidak maka berjanjilah Anda akan mendapatkan sesuatu yang lain :) Anda tidak bisa hidup cdsendirian.

Derek Wyatt
sumber
3

Jika Anda hanya memiliki 2 direktori, cara termudah adalah, seperti yang disebutkan,

cd -

Ketika saya memiliki hal-hal seperti itu di masa lalu, saya memiliki beberapa trik yang telah saya lakukan, yang mungkin bisa membantu.

  1. Masukkan perintah alias di file .cshrc, kira-kira seperti ini

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Tautkan pintasan ke jalur yang diinginkan dari direktori rumah saya. Ini adalah satu hal.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Ini memungkinkan pengubahan direktori semudah:

   cd ~/moo
   cd ~/blargh
PearsonArtPhoto
sumber
2

Autojump adalah perintah "cd" bash / sh / zsh yang dari tindakan Anda, lihat video ini .

jadi ini akan memindahkan Anda ke moo setelah mempelajari folder terakhir

j moo
oluies
sumber
2

balok

Saya memiliki alat sendiri, tetapi akan melihat alat Dereks dan jjuga.

Tentu saja pilihan pertama untuk melompat bolak-balik adalah

cd -

Alat saya dimaksudkan untuk direktori dengan nama unik pada sistem, jika locatetersedia; itu mencari nama direktori yang cocok, dan melompat ke pertandingan pertama:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

Ketergantungan:

  • menemukan
  • grep
  • kepala

Kekurangan:

  • direktori yang lebih baru daripada yang terbaru dijalankan-b tidak ditemukan
  • jika lebih dari satu direktori cocok, itu tergantung pada keberuntungan Anda, apakah Anda berseri-seri dengan yang Anda pikirkan.

Perbaikan / modifikasi:

  • alih-alih memilih direktori pertama, kode dapat dimodifikasi untuk menampilkan daftar pilihan, mendorong pengguna untuk memasukkan 1,2,3, ... untuk pergi ke / bin, / usr / bin, / usr / local / bin ...

Pemakaian:

  • letakkan fungsi tersebut ke Anda /etc/bash.bashrc atau ~ / .bashprofile, untuk menggunakannya dengan nyaman.

Keuntungan dari solusi saya:

  • tidak terbatas pada 2 direktori, seperti cd -
  • Anda tidak perlu mengunjungi direktori satu kali, sebelum menggunakan balok.
Pengguna tidak diketahui
sumber