Làm thế nào tôi có thể thay đổi thư mục trước đó thay vì đi lên?


214

Tôi hiện đang dành rất nhiều thời gian làm việc của mình để di chuyển qua lại giữa hai con đường rất xa cây và chuyển hướng từ nhau ở gốc. Tôi nhận ra rằng cuộc sống của tôi sẽ dễ dàng hơn rất nhiều nếu có một cuộc tranh cãi cdđưa người dùng đến thư mục cuối cùng mà họ đang ở.

Đó là, nếu tôi ở:

/etc/foo/bar/baz/moo

và sau đó gõ:

cd /var/lib/fubarred_app/blargh/logs

Tôi muốn có thể quay lại thư mục đầu tiên mà không phải gõ lại toàn bộ đường dẫn.

Khóa bộ nhớ không cắt được vì tôi sử dụng đủ các lệnh ở mỗi nơi khiến việc quay trở lại và tìm đường đi tôi muốn cũng khó như tự gõ.

Có một lệnh ngắn sẽ cho phép tôi đi đến thư mục trước?


8
Ngoài câu trả lời tuyệt vời của @ bryan , bạn có thể xem xét việc tạo một cặp bí danh cho mỗi đường dẫn để bạn có thể nhập một cái gì đó như: " bazmoo" hoặc " blarghlog" tại dấu nhắc :)
warren

4
Tại sao bạn không sử dụng màn hình GNU ?
Shi

2
Vỏ nào? Điều đó tạo ra một sự khác biệt rất lớn.
Randal Schwartz

@warren ditto. đó là cách ưa thích của tôi để làm mọi thứ. một nửa những gì tôi sử dụng máy tính của mình bây giờ có bí danh riêng của mình ... =)
ixtmixilix

Fasd là tuyệt vời. Kiểm tra nó ra.
Majkinetor

Câu trả lời:


301

Lệnh

cd -

sẽ thực hiện trao đổi bạn cần trên hầu hết các shell chính, biến thể cũ hơn là

cd "$OLDPWD"

sẽ sử dụng biến môi trường có chứa thư mục làm việc trước đó.


Trang hướng dẫn POSIX chocd đề cập:

SỰ MIÊU TẢ

Nếu trong quá trình thực hiện các bước trên, biến môi trường PWD bị thay đổi, biến môi trường OLDPWD cũng sẽ được thay đổi thành giá trị của thư mục làm việc cũ (đó là thư mục làm việc hiện tại ngay trước lệnh gọi cd).

TOÁN HẠNG

  -   Khi một dấu gạch nối được sử dụng làm toán hạng, điều này sẽ tương đương với lệnh:

cd "$OLDPWD" && pwd 

thay đổi thư mục làm việc trước đó và sau đó viết tên của nó.


7
Hãy nhớ rằng điều này thực sự phụ thuộc vào lớp vỏ bạn đang sử dụng và vì bạn không chỉ định, thật khó để đưa ra câu trả lời "di động" không tồn tại.
Randal Schwartz

16
@Randall, Có lẽ bạn có thể kết hợp tất cả các nhận xét vỏ riêng lẻ của mình vào một câu trả lời Voltron-Shell.
hyperslug

@Randall. Tôi đã sử dụng bash. Nó hoạt động trong ksh và zsh quá. Nhân tiện, lần đầu tiên tôi học lập trình từ phiên bản Learning Perl năm 1994 nên xin lỗi tôi trong khi tôi hâm mộ một chút. :)
Yitzchak

Hmm, tôi đã sử dụng cd $OLDPWDcho điều này. Thật tuyệt khi vỏ chính cung cấp một hình thức ngắn hơn.
ulidtko

2
@sinni Một số hương vị nhất định phảipushd, và ít nhất đó là một tích hợp sẵn bash.
slhck

105

Ngoài câu trả lời của bryan, điều đáng nói là cũng có pushd, và popdnó xây dựng các thư mục giống như một chồng. Điều này cũng có sẵn trên Windows NT; tuy nhiên, nó không có sẵn trong tất cả các vỏ.

Ví dụ: chúng tôi có thể đi đến ba thư mục khác nhau và bạn sẽ luôn thấy ngăn xếp của mình khi bạn gọi pushd:

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

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

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

Và khi bạn gọi popdba lần liên tiếp, bạn sẽ đến các thư mục đó trong ngăn xếp theo thứ tự ngược lại. Đồng thời, ngăn xếp sẽ được làm trống một lần nữa.

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

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

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

Nếu bạn đang sử dụng Zsh; nó có tùy chọn AUTO_PUSHD, nó sẽ tự động đẩy cdchúng lên ngăn xếp.


Pushd và popd không có sẵn trong tất cả các shell.
Randal Schwartz

5
@ Wiesław: Thật sao? Tôi muốn bash có mà ... Dĩ nhiên, tôi có thể bí danh cdđể pushd, và nó sẽ hầu như không thay đổi.
Chris Charabaruk

3
Hoặc bí danh pd để đẩy và có cả hai. BTW Pushd (hoặc pd, nếu bạn đặt bí danh) tự nó hoán đổi thư mục hiện tại và thư mục được đẩy cuối cùng, về cơ bản hoàn thành những gì 'cd -' làm.
JRobert

Tôi thích khái niệm này nhưng không bao giờ quen với chúng.
Thorbjørn Ravn Andersen

13

Có một số chương trình "nhảy"

  • autojump (được duy trì với các tính năng cơ bản)
  • j2 (dường như không rõ ràng với một số tính năng nâng cao)
  • z (phiên bản duy trì của "j" với các tính năng nâng cao)

Những dễ dàng bất kỳ loại điều hướng thư mục. Bạn sử dụng nó bằng cách đưa ra một phần của đường dẫn và nó chỉ hoạt động.

Trong trường hợp của bạn

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

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

Bạn có thể gán bất kỳ chữ cái nào bạn muốn cho các chương trình này, "j" là truyền thống :)

j2 và z hỗ trợ nhiều cụm từ tìm kiếm, ...

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

... và nhiều lựa chọn hơn.

~$ 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

2
"J" rõ ràng là vỏ cụ thể. Bạn đã không nói điều đó.
Randal Schwartz

3
@Randal: Làm thế nào là nó cụ thể vỏ? Đó là một chương trình.
Fixee

3
Tôi là một thằng ngốc. :) Tôi thấy nó bây giờ.
Randal Schwartz

10

Ngoài cd -cd $OLDPWD

Bạn có thể sử dụng tìm kiếm lịch sử bằng cách nhấn CTRL-Rvà nhập một vài chữ cái của cdlệnh bạn đã nhập trước đó. Nhấn CTRL-Rliên tục sẽ mang lại các trận đấu cũ hơn.

Phương pháp này sẽ hữu ích hơn nếu bạn có nhiều hơn hai đường dẫn để thay đổi.


1
CTRL-R sẽ không nhất thiết phải giúp đỡ. Bạn có thể đã ở trong / some / obscure / thư mục / deep và thực hiện "cd evendeeperdir" sau đó chuyển đến ~ / somehere / khác.
vào

1
Tuyệt quá! Nó hoạt động cho những thứ khác hơn cd, giúp đỡ rất nhiều!
Niloct

9

Bạn có thể sử dụng điều này để dễ dàng tạo bí danh cho các thư mục:

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

a 1

và sau đó:

1

1
Chỉ trên một vỏ hiểu được bí danh và chức năng. Không phải tất cả làm.
Randal Schwartz

Vì vậy, bỏ qua việc gõ các alias =bộ phận? hmmmm
Xen2050

6

bashmark sẽ cho phép bạn đánh dấu một loạt các thư mục và nhảy giữa chúng với việc hoàn thành tab:

Để đánh dấu một thư mục, chỉ cần vào thư mục đó, sau đó đánh dấu nó như sau:

bookmark foo

Dấu trang sẽ được đặt tên là "foo". Khi bạn muốn quay lại thư mục đó, hãy sử dụng:

go foo

Để xem danh sách các dấu trang:

bookmarksshow

Hoàn thành tab hoạt động, để đi đến dấu trang shoobie, chỉ cần:

go sho[tab]

4

Một khả năng khác là chỉ cần giữ hai cửa sổ mở, với một vị trí ở mỗi thư mục.


Mặc dù không có lịch sử chia sẻ, nếu bạn sử dụng / chỉnh sửa các lệnh trước đó thường xuyên (có thể thiết lập lại sẽ nhận được chúng ...?)
Xen2050

@ Xen2050 Xem tùy chọn shell share_historytrong zsh.
Radon Rosborough

4

Tôi biết điều này không hoàn toàn nói một câu trả lời cho câu hỏi của bạn, nhưng nó hữu ích trong việc đạt được mục tiêu đưa bạn đến các thư mục quan trọng của bạn .

trong bất kỳ UNIX-bash gốc nào, bạn có thể sử dụng CDPATH để mở rộng thư mục tìm kiếm lệnh cd trong.

từ tệp .bashrc của tôi:

export CDPATH='.:~/source/'

đầu tiên cd tìm kiếm trong thư mục hiện tại của bạn, sau đó tìm kiếm trong thư mục mã hóa dự án của tôi.

cd myproject

.. đưa tôi đến ~ / nguồn / myproject từ nơi tôi đang đứng.

Tính năng nhỏ đơn giản đã giúp điều hướng thư mục của tôi rất nhiều.


1
+1 Điều này thêm thư mục CDPATH vào cddanh sách tự động hoàn thành (TAB), đó là Tốt. Nhưng nếu .không được bao gồm và nếu có một thư mục trong một thư mục CDPATH với cùng tên là một trong thư mục hiện tại của bạn, sau đó cd samenamesẽ được chuyển tới thư mục CDPATH và không một trong thư mục hiện hành, đó là Bad. Phải sử dụng cd ./samenameđể vào một thư mục kép.
Xen2050

Vâng, bình luận tốt. Luôn luôn bao gồm đầu tiên . hoặc bạn sẽ trải nghiệm những thứ kỳ lạ.
phareim

3

Yup, cd -là con đường để đi nhưng tôi lo lắng về việc thiếu sức mạnh mà bạn có trong vỏ bọc của mình. popdpushdcũng tốt, và jđiều đó cũng có vẻ tốt.

Tôi sẽ ném tiện ích của riêng mình vào vòng ... đó chỉ là thứ tôi đã xây dựng, tùy chỉnh và di chuyển với tôi trong 10 năm qua hoặc lâu hơn và nó hoạt động tốt với những gì tôi muốn nó làm.

Blog bài cho tiện ích quản lý thư mục của tôi

Nếu nó hiệu quả với bạn, thì thật tuyệt vời, nhưng nếu nó không hứa với tôi bạn sẽ nhận được thứ gì đó khác :) Bạn chỉ đơn giản là không thể sống cdmột mình.


3

Nếu bạn chỉ có 2 thư mục, cách dễ nhất là, như đã đề cập,

cd -

Khi tôi có những điều như vậy trong quá khứ, tôi đã có một vài thủ thuật mà tôi đã làm, điều đó có thể hữu ích.

  1. Đặt các lệnh bí danh trong tệp .cshrc, đại loại như thế này

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Liên kết các phím tắt đến các đường dẫn quan tâm từ thư mục nhà của tôi. Đây là một điều một lần.

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

Điều này sẽ cho phép thay đổi một thư mục dễ dàng như:

   cd ~/moo
   cd ~/blargh

2

Autojump là lệnh "cd" bash / sh / zsh mà từ hành động của bạn, hãy xem video này .

Vì vậy, điều này sẽ chuyển bạn đến moo sau khi nó đã học các thư mục cuối cùng

j moo

2

chùm tia

Tôi có công cụ của riêng mình, nhưng cũng sẽ xem công cụ Dereks j.

Tất nhiên lựa chọn đầu tiên để nhảy qua nhảy lại là

cd -

Công cụ của tôi có nghĩa là cho các thư mục có tên duy nhất trên các hệ thống, nơi locatecó sẵn; nó tìm kiếm một tên thư mục phù hợp và nhảy vào trận đấu đầu tiên:

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

Phụ thuộc:

  • định vị
  • grep
  • cái đầu

Hạn chế:

  • thư mục mới hơn bản cập nhật mới nhất không được tìm thấy
  • nếu có nhiều hơn một thư mục phù hợp, điều đó phụ thuộc vào vận may của bạn, cho dù bạn có rạng rỡ với thư mục mà bạn có trong đầu.

Cải tiến / sửa đổi:

  • thay vì chọn thư mục đầu tiên, mã có thể được sửa đổi để hiển thị danh sách các lựa chọn, nhắc người dùng nhập 1,2,3, ... để đi đến / bin, / usr / bin, / usr / local / bin ...

Sử dụng:

  • đưa chức năng vào bạn /etc/bash.bashrc hoặc ~ / .bashprofile, để sử dụng nó một cách thuận tiện.

Ưu điểm của giải pháp của tôi:

  • không giới hạn ở 2 thư mục, như cd -
  • bạn không phải truy cập các thư mục một lần, trước khi sử dụng chùm tia.
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.