سؤال كيف يمكنني تغيير الدليل السابق بدلاً من الصعود؟


أقضي حاليًا الكثير من ساعات عملي في التنقل ذهابًا وإيابًا بين مسارين بعيدًا جدًا عن الشجرة وتحويلهما من بعضهما البعض في الجذر. يبدو لي أن حياتي ستكون أسهل بكثير لو كان هناك جدال cd يأخذ المستخدم إلى آخر دليل كانوا فيه.

هذا إذا كنت في:

/etc/foo/bar/baz/moo

ثم اكتب:

cd /var/lib/fubarred_app/blargh/logs

أود أن أتمكن من العودة إلى أول دليل دون الحاجة إلى كتابة المسار بأكمله مرة أخرى.

لا يقوم مفتاح الذاكرة بقطعه لأنني أستخدم الأوامر الكافية في كل مكان بحيث يصعب الرجوع إليها والعثور على المسار الذي أريده ، حيث أنه يتم كتابته بنفسي.

هل هناك أمر قصير يسمح لي بالذهاب إلى الدليل السابق؟


209
2017-08-17 20:18


الأصل


بالإضافة إلى @براينإجابة ممتازة ، قد تفكر في إنشاء زوج من الأسماء المستعارة لكل مسار بحيث يمكنك كتابة شيء مثل: "bazmoo"أو"blarghlog"عند الطلب :) - warren
لماذا لا تستخدم فقط شاشة جنو؟ - Shi
أي قذيفة؟ ذلك يجعل هناك فرق شاسع. - Randal Schwartz
warren ditto. هذه هي الطريقة المفضلة للقيام بكل شيء. نصف ما يمكنني استخدام جهاز الكمبيوتر الخاص به لديه اسم مستعار خاص به الآن ... =) - ixtmixilix
Fasd رائع. تحقق من ذلك. - majkinetor


الأجوبة:


الامر

cd -

سيقوم بإجراء التبادل الذي تحتاجه على معظم الأصداف السائدة ، والمتغير الأطول الأكبر هو

cd "$OLDPWD"

والتي سوف تستخدم متغير البيئة الذي يحتوي على دليل العمل السابق.


ال POSIX صفحة رجل ل cd يذكر:

وصف

إذا تغير متغير بيئة PWD أثناء تنفيذ الخطوات المذكورة أعلاه ، فسيتم تغيير متغير بيئة OLDPWD إلى قيمة دليل العمل القديم (وهو دليل العمل الحالي مباشرة قبل استدعاء cd).

المعاملات

-عند استخدام واصلة كمعامل ، يجب أن يكون هذا مساويًا للأمر:

cd "$OLDPWD" && pwd 

الذي يتغير إلى دليل العمل السابق ومن ثم يكتب اسمه.


292
2017-08-17 20:23



ضع في اعتبارك أن هذا يعتمد على الصدفة التي تستخدمها ، وبما أنك لم تحدد ، سيكون من الصعب إعطاء الإجابة "المحمولة" غير الموجودة. - Randal Schwartz
@ راندال ، ربما يمكنك الجمع بين كل التعليقات الخاصة بك على غلاف واحد في جواب واحد من فولترون شل. - hyperslug
Randall. كنت أستخدم باش. يعمل في ksh و zsh أيضا. بالمناسبة ، تعلمت لأول مرة للبرنامج من طبعة عام 1994 تعلم بيرل لذا أعذرني بينما أنا معجب. :) - Yitzchak
هم ، أنا استخدمتها cd $OLDPWD لهذا. من اللطيف أن تعرض القذائف السائدة شكلاً أقصر. - ulidtko
sinni نكهات معينة فعل يملك pushd، وعلى الأقل انها بنيت في bash. - slhck


بالإضافة إلى إجابة براين ، من الجدير بالذكر أن هناك أيضًا pushd و popd، والتي تراكم الدلائل مثل كومة. هذا يتوفر أيضًا على Windows NT؛ ومع ذلك ، فهو غير متوفر في جميع الأصداف.

على سبيل المثال ، يمكننا الانتقال إلى ثلاثة دلائل مختلفة ، وستظهر دومًا كدسة عند الاتصال pushd:

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

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

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

وعند الاتصال popd ثلاث مرات على التوالي ، يمكنك الوصول إلى تلك الدلائل في بنية تخزين العناصر في ترتيب عكسي. في نفس الوقت ، سيتم إفراغ بنية تخزين العناصر مرة أخرى.

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

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

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

إذا كنت تستخدم Zsh ؛ لديها خيار AUTO_PUSHD ، والتي سوف تدفع تلقائيا cdعلى كومة.


105
2017-08-17 20:35



pushd و popd ليست متاحة في جميع قذائف. - Randal Schwartz
@ فيسلاف: حقا؟ أتمنى لو باش ذلك ... بالطبع ، يمكن أن اسم مستعار cd إلى pushd، وغالبًا ما تكون هي نفسها. - Chris Charabaruk
أو الاسم المستعار إلى pushd ويكون كلاهما. BTW pushd (أو pd ، إذا كنت اسم مستعار) بمبادلة بالدليل الحالي والدليل الذي تم دفعه أخيرًا ، بشكل أساسي يحقق ما "cd -". - JRobert
أنا أحب هذا المفهوم ولكن لم تعتاد عليهم. - Thorbjørn Ravn Andersen


هناك بعض البرامج "قفزة"

  • autojump (الحفاظ على الميزات الأساسية)
  • J2  (على ما يبدو غير متأكد من بعض الميزات المتقدمة)
  • ض (حافظت على نسخة من "j" مع ميزات متقدمة)

هذه سهولة أي نوع من التنقل في الدليل. يمكنك استخدامه عن طريق إعطاء جزء من المسار ويعمل فقط.

في حالتك

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

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

يمكنك تعيين أي حرف تريده لهذه البرامج ، "j" هو التقليد :)

j2 و z دعم مصطلحات بحث متعددة ، ...

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

... والمزيد من الخيارات.

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

13
2017-08-17 23:52



"ج" هو واضح قذيفة محددة. أنت لم تقل ذلك - Randal Schwartz
Randal: كيف يتم قذيفة محددة؟ إنه برنامج - Fixee
أنا مغفل. :) أرى الآن. - Randal Schwartz


بالإضافة إلى cd - و cd $OLDPWD

يمكنك استخدام البحث عن التاريخ عن طريق الضغط CTRL-R وكتابة بعض الحروف من cd الأمر الذي أدخلته من قبل. ملح CTRL-R مرارا وتكرارا سيجلب المباريات القديمة.

ستكون هذه الطريقة أكثر فائدة إذا كان لديك أكثر من مسارين للتغيير.


10
2017-08-18 09:44



CTRL-R لن يساعد بالضرورة. قد تكون في / بعض / غامضة / الدليل / عميق وفعلت "cd evendeeperdir" ثم ذهب إلى ~ / في أي مكان / مختلف. - justintime
عظيم! وهو يعمل لأشياء أخرى من cd، مساعدة كبيرة! - Niloct


يمكنك استخدام هذا لجعل الأسماء المستعارة للأدلة بسهولة:

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

a 1

و لاحقا:

1

9
2017-08-18 01:50



فقط على وعاء يفهم الأسماء المستعارة والوظائف. ليس كل ما يفعل. - Randal Schwartz
لذلك هذا يتخطى كتابة alias = أجزاء؟ HMMMM - Xen2050


bashmarks سيتيح لك وضع علامة مرجعية على سلسلة من المجلدات والانتقال بينها وبين اكتمال علامة التبويب:

لوضع إشارة على مجلد ، ما عليك سوى الانتقال إلى هذا المجلد ، ثم وضع إشارة مرجعية عليه كما يلي:

bookmark foo

ستكون الإشارة المرجعية "foo". عندما تريد العودة إلى هذا المجلد ، استخدم:

go foo

لمشاهدة قائمة من الإشارات المرجعية:

bookmarksshow

يعمل اكتمال علامة التبويب ، للانتقال إلى الإشارة المرجعية shoobie ، ببساطة:

go sho[tab]

6
2017-08-18 08:54





هناك احتمال آخر يتمثل في إبقاء نافذتين مفتوحتين ، مع وضع واحد في كل دليل.


4
2017-08-18 03:00



لا يوجد سجل مشترك على الرغم من ذلك ، إذا كنت تستخدم / تحرير الأوامر السابقة بانتظام (ربما سيجعل إعادة تعيين لهم ...؟) - Xen2050
@ Xen2050 شاهد خيار shell share_history في zsh. - Radon Rosborough


أعلم أن هذا ليس جوابًا دقيقًا على سؤالك ، ولكنه مفيد في الوصول إلى هدف يأخذك إلى الدلائل الهامة الخاصة بك.

في أي سلالة UNIX-bash يمكنك استخدامها CDPATH لتوسيع المجلد الذي يبحث عنه الأمر cd.

من ملفي .bashrc:

export CDPATH='.:~/source/'

القرص المضغوط يبحث أولاً في مجلدك الحالي ، ثم يبحث في دليل المشروع-الترميز.

cd myproject

.. يأخذني إلى ~ / مصادر / myproject من أي وقت مضى وأنا أقف حاليا.

ميزة بسيطة بسيطة ساعدت على التنقل في الدليل كثيرًا.


4
2017-08-19 11:11



+1 هذا يضيف المجلد CDPATH إلى cdقائمة الإكمال التلقائي (TAB) ، وهو جيد. لكن إذا كان . غير مرفق وإذا كان هناك مجلد في مجلد CDPATH مع نفس الاسم كواحد في الدليل الحالي الخاص بك ، ثم cd samename سوف تذهب إلى دليل CDPATH و ليس واحد في الدليل الحالي ، وهو سيء. لديك لاستخدام cd ./samename للوصول إلى مجلد مزدوج. - Xen2050
نعم ، تعليق جيد. دائما تشمل الأول .، أو ستواجه أشياء غريبة. - phareim


نعم، cd - هو الطريق الذي يجب أن أذهب إليه ولكني قلق بشأن قلة الطاقة التي لديك في صدرك. popd و pushd هي أيضا جيدة ، وهذا j الشيء يبدو جيدا أيضا.

سأرمي فائدتي الخاصة في الحلبة ... إنه مجرد شيء أقوم ببنائه وتخصيصه وزيارتي خلال السنوات العشر الماضية أو نحو ذلك ، وهو يعمل على ما أريد فعله.

مشاركة مدونة لأداة إدارة الدليل الخاصة بي

إذا كان يعمل من أجلك ، ثم رهيبة ، ولكن إذا لم يعد لي أنك سوف تحصل على شيء آخر :) أنت ببساطة لا يمكن العيش مع cd وحده.


3
2017-08-18 14:18





إذا كان لديك فقط دليلين ، فإن أسهل طريقة هي ، كما ذكرنا ،

cd -

عندما أتيحت لي مثل هذه الأشياء في الماضي ، كان لدي بعض الحيل التي قمت بها ، والتي قد تكون مفيدة.

  1. ضع أوامر مستعارة في ملف .cshrc ، شيء مثل هذا

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. ربط الاختصارات إلى مسارات الفائدة من الدليل الرئيسي الخاص بي. هذا هو شيء مرة واحدة.

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

سيسمح هذا بتغيير الدليل بالسهولة التالية:

   cd ~/moo
   cd ~/blargh

3
2017-08-19 03:08