मेरे लिए pushd / popd / dirs करीब-करीब मददगार है, लेकिन कमी है। इसलिए मैंने इन 'नेवड' के चारों ओर एक 'रैपर' बनाया, जिसे अनिवार्य रूप से 20 उपनामों के रूप में लागू किया गया था। (उनमें से एक फ़ंक्शन है, वास्तव में।) कोड नीचे है, लेकिन यहां पहले एक संक्षिप्त विवरण है। (एक अच्छी बात "नौसेना" के बारे में और अन्य लोगों की मशीनों पर काम करना: इसे चलाने का एक "नो-इंस्टाल" रूप है: एक इंस्टॉल विकल्प के रूप में आप बस उन कमांडों को पेस्ट कर सकते हैं जो बैश-प्रॉम्प्ट पर "नेवी" लागू करते हैं , और उस मशीन नेवी के लिए उस बैश-सत्र की अवधि के लिए काम करेगा। यह फ़ाइल-सिस्टम में शून्य फुट-प्रिंट देता है, फिर भी यह एक अस्थायी इंस्टॉल है। उन कमांड को "वास्तविक" इंस्टॉल के लिए .bashrc में डालें। पाठ्यक्रम।)
विशेषताएं:
navd <path>; -- will make that path the current dir AND will add it to the stack
AS A BONUS: If a relative path is used, this command is added to history
with an absolute path instead. This improves navigation even when only
using history ... because very often relative-path commands in history
are useless if the command changes the current directory. (After all, you
would have to be in the directory the command was originally issued
from in order for such a command to work correctly.)
navd -- shows the stack, with index numbers for convenience
navd0 -- makes the first entry on the stack (read left-to-right) **the current dir**
navd1 -- makes the second entry on the stack (read left-to-right) **the current dir**
.
.
.
navd9 -- makes the tenth entry on the stack (read left-to-right) **the current dir**
navd-1 -- makes the first entry on the stack WHEN READ RIGHT-to-LEFT(!) **the current dir**
. ^^^^^^^^^^^^^^^^^^^^^^^^^^
.
.
navd-9 -- makes the 9th entry on the stack WHEN READ RIGHT-to-LEFT(!) **the current dir**
उन्नीस navd <N> का कोई भी आदेशों घूमता ढेर इतना है कि निर्देशिका है कि वर्तमान dir हो जाता है यह भी अब ढेर के मोर्चे पर प्रदर्शित करता है। धनात्मक <N> मान शून्य से शुरू होने वाले अनुक्रमण के साथ, बाईं ओर से एक गिनती गिनते हैं। ऋणात्मक <N> मानों को एक -1 से शुरू होने के साथ राइट से एक गिनती गिनना है। (यह जावा और अन्य भाषाओं में एरे-इंडेक्स का उपयोग कैसे किया जा सकता है, इस सम्मेलन का अनुसरण करता है।)
नोट: कोई भी "नेवी" कमांड उसी स्टैक को प्रदर्शित करता है जो "पुशड" और "डीआईआरएस" का उपयोग करता है - लेकिन इसे बाईं-सबसे प्रविष्टि के बिना प्रदर्शित करता है
कि "डायर" प्रदर्शित होगा (क्योंकि यह प्रविष्टि वास्तव में स्टैक पर नहीं है - यह है वर्तमान निर्देशिका
और "dirs" के साथ कि अगर cd कमांड दर्ज किया गया है तो सबसे अधिक प्रविष्टि बदल जाती है)। ("Cd <path>" कमांड नौसेना के किसी भी व्यवहार को प्रभावित नहीं करता है, हालांकि यह निश्चित रूप से पुशड / dirs / popd के व्यवहार को प्रभावित करता है । इसके अलावा ... मुझे एक बार "वापस" जाने के लिए "cd -" का उपयोग करना पसंद है। निर्देशिका मैं सिर्फ से दूर नेविगेट किया, और "सीडी -" या तो नौसेना के व्यवहार को प्रभावित नहीं करता है।)
बोनस: 19 और उपनाम हो सकते हैं जो स्टैक को घुमाते नहीं हैं, लेकिन स्टैक पर संकेतित स्थान पर केवल डायर बदलते हैं।
nav0 ... nav9 and nav-1 ... nav-9
दूसरा बोनस: कट-एन-पेस्ट के साथ स्टैक को आसानी से लोड करने के लिए, इतिहास से नौसेना <पथ> आदेशों को दिखाता है। (प्रत्येक को केवल एक बार सूचीबद्ध किया जाता है, भले ही वह कई बार इतिहास में हो, और सूची को क्रमबद्ध किया जाता है। इसके अलावा, प्रविष्टियों को एक $ HOME / .navhignore फ़ाइल में डाला जा सकता है ताकि उन सटीक प्रविष्टियों को नौवीं सूची में आने से रोका जा सके।)
navh
तीन प्रमुख व्यवहार:
यदि आप स्टैक को साफ़ करते हैं और एक विशिष्ट "नौसेना <पथ>" कमांड दोहराते हैं, तो वह पथ स्टैक पर जाएगा। यही मैं चाहता हूं और उम्मीद करता हूं ... लेकिन पुशड ऐसा नहीं करता है - यह वर्तमान डायर डालता है जिसे आप स्टैक पर AWAY से नेविगेट कर रहे हैं - इसलिए जब आप कमांड को दोहराते हैं तो स्टैक पर प्रभाव परिवर्तनशील होता है (अप्रत्याशित लगता है)। ।
"navd <path>" समान पथ को दो बार स्टैक पर नहीं रखेगा।
"navd <path>" कमांड इतिहास में खुद को निरपेक्ष पथ के साथ रखता है, भले ही सापेक्ष पथ कमांड के लिए टाइप किया गया हो।
मेरे लिए, वर्णित अंतिम तीन व्यवहार इतिहास से "पुश <पथ>" का उपयोग करने की तुलना में इतिहास से "अधिक उपयोगी" पथ का उपयोग करते हैं। मैं वास्तव में स्थानों पर जाने के लिए इतिहास का फिर से उपयोग कर सकता हूं । और जब मैं ऐसा करता हूं तो मैं अपने स्टैक को "खराब" नहीं करता।
यदि आप अपने मस्तिष्क को इसके चारों ओर लपेटना चाहते हैं, तो आप नौसेना और पुशड / डायर / पोप का उपयोग कर स्विच कर सकते हैं। दोनों एक ही स्टैक का उपयोग करते हैं; बस एक अलग शैली के साथ। उदाहरण के लिए, "नेवड" स्टैक से चीजों को हटाने के लिए "पोप" का उपयोग करें, या नौसेना स्टैक को खाली करने के लिए "डायर -सी" का उपयोग करें।
पुशड / डायर / पोप के बारे में सोचें कि "मैं अपने कदम कैसे दोहराऊं?"।
नौसेना के बारे में सोचो "मैं पसंदीदा निर्देशिकाओं के एक सेट पर कैसे पकड़ सकता हूं, और आसानी से उनके बीच स्विच कर सकता हूं?"।
एक टर्मिनल विंडो में निम्नलिखित पेस्ट करें, और आप तुरंत उस टर्मिनल-सत्र की अवधि के लिए नौसेना का उपयोग करना शुरू कर सकते हैं। इस सुविधा के लिए यह सभी कोड है।
# Add 1 function and many related aliases for something like "pushd", called "navd". http://unix.stackexchange.com/a/229161
# Think of pushd/dirs/popd as "how do I retrace my steps?".
# Think of navd as "how do I hold on to a set of favorite directories, and easily switch between them?".
# Pseudo-code to explain each part of the "navd" bash function just below:
# If no arguments to the 'navd' command:
# If stack has entries, then print the stack one-line-per-dir with each line numbered.
# Else, if stack is empty, automatically run the equivalent of the navh command.
# Else (there **are** arguments to the 'navd' command):
# If arg is '--help' or '/?' then show help.
# Else (arg is assumed to be a path to a directory)
# Remember the directory we are starting at
# Change to dir given as argument (the "arg-dir"), and do a few chores:
# Do not use arg-dir literally ... instead, magically put the **absolute** path we arrived at into history.
# Set a flag if the arg-dir is already in the stack.
# If the flag is set then just show the stack (on one line), else ADD to stack, ROTATE to end-of-stack, and show the stack.
# Change to dir we started at and then back to the arg-dir. This allows "cd -" to go back to dir we started at.
# End-If
# End-If
navd () {
if [[ $1 == '' ]]; then #--no arguments to the 'navd' command
if dirs +1 >/dev/null 2>&1; then #------stack has entries
dirs -p | perl -ne 'print (-1+$cn++); print "$_"' | grep -v "^-1";
else #------stack is empty
echo "The navd stack is empty. Now running 'navh' in case that's helpful. navd --help works."
if [[ ! -f $HOME/.navhignore ]]; then echo -n ''>>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/ /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"
fi
else #--(there **are** arguments to the 'navd' command)
if [[ $1 == '--help' || $1 == '/?' ]]; then #------arg is '--help' or '/?'
echo "The 'navd' functionality is nothing but one bash function and a set of aliases."
echo "It offers a different style of handy directory navigation than pushd/popd."
echo "It uses the same 'stack' as pushd. Look in the .bashrc file for details."
echo " (Think of pushd/dirs/popd as 'how do I retrace my steps?'."
echo " Think of navd as 'how do I remember a set of favorite directories,"
echo " and easily switch between them?'.)"
echo "As of 10/2015, this link has more info: http://unix.stackexchange.com/a/229161"
echo "Here is the set of navd-related aliases. None need any parameter:"
alias | grep 'alias nav' | cut -d= -f1 | grep -v '-' | grep -v 'navh'
alias | grep 'alias nav' | cut -d= -f1 | grep '-'
echo "alias navh # The 'navh' alias has nothing to display until a 'navd <path>' is run. Short for nav-history."
echo "---- To get started, simpy type navd followed by your favorite path. ----"
echo "---- navd with no param shows stack. nav0 navigates to first on stack. ----"
else #------(arg is assumed to be a path to a directory)
mypwd="$PWD"
cd "$1" >/dev/null;
history -s `echo "$PWD" | perl -pe 's/$ENV{'HOME'}/~/;s/ /\\\\ /g;s/^/navd /'`
myflag=`dirs -p | perl -pe 's/\n/:/' | perl -ne '@a=split(":");$pwd=shift(@a);$flag=0;foreach (@a) {if ($_ eq $pwd) {$flag=1}};print $flag'`
if [[ $myflag == 1 ]]; then dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"; else pushd .>/dev/null; pushd +1>/dev/null; dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"; fi
cd "$mypwd"; cd "`dirs -l -0`"
fi
fi
};
# Aliases for navigating and rotating the "pushd" stack in the style of "navd":
alias navd0='cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"' # "-l" is dash-L, and expands "~" to denote the home dir. Needed inside back-ticks.
alias navd1='cd "`dirs -l +1`";pushd -n +1;cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd2='myd=$PWD;cd "`dirs -l +1`";for i in {1..2};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd3='myd=$PWD;cd "`dirs -l +1`";for i in {1..3};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd4='myd=$PWD;cd "`dirs -l +1`";for i in {1..4};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd5='myd=$PWD;cd "`dirs -l +1`";for i in {1..5};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd6='myd=$PWD;cd "`dirs -l +1`";for i in {1..6};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd7='myd=$PWD;cd "`dirs -l +1`";for i in {1..7};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd8='myd=$PWD;cd "`dirs -l +1`";for i in {1..8};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd9='myd=$PWD;cd "`dirs -l +1`";for i in {1..9};do pushd -n +1>/dev/null;cd "`dirs -l +1`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-1='cd "`dirs -l -0`";pushd -n -0>/dev/null; dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-2='myd=$PWD;cd "`dirs -l -0`";pushd -n -0>/dev/null;cd "`dirs -l -0`";pushd -n -0>/dev/null;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-3='myd=$PWD;cd "`dirs -l -0`";for i in {1..3};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-4='myd=$PWD;cd "`dirs -l -0`";for i in {1..4};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-5='myd=$PWD;cd "`dirs -l -0`";for i in {1..5};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-6='myd=$PWD;cd "`dirs -l -0`";for i in {1..6};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-7='myd=$PWD;cd "`dirs -l -0`";for i in {1..7};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-8='myd=$PWD;cd "`dirs -l -0`";for i in {1..8};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias navd-9='myd=$PWD;cd "`dirs -l -0`";for i in {1..9};do pushd -n -0>/dev/null;cd "`dirs -l -0`";done;cd "$myd";cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
# BONUS commands (beyond the 20). Aliases for navigating but NOT rotating the "navd" stack:
# Help in remembering: "navd<#>" does more since it both changes the PWD and rotates the stack, whereas "nav<#>" does less
# (and has one letter less) since "nav<#>" only changes the PWD. Also "navd<#>" acts like the pushd-related command: dirs
# There is no "nav" command (with no number) so that there will be no conflict if any program called "nav" is used.
alias nav0='cd "`dirs -l +1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav1='cd "`dirs -l +2`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav2='cd "`dirs -l +3`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav3='cd "`dirs -l +4`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav4='cd "`dirs -l +5`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav5='cd "`dirs -l +6`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav6='cd "`dirs -l +7`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav7='cd "`dirs -l +8`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav8='cd "`dirs -l +9`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav9='cd "`dirs -l +10`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-1='cd "`dirs -l -0`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-2='cd "`dirs -l -1`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-3='cd "`dirs -l -2`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-4='cd "`dirs -l -3`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-5='cd "`dirs -l -4`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-6='cd "`dirs -l -5`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-7='cd "`dirs -l -6`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-8='cd "`dirs -l -7`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
alias nav-9='cd "`dirs -l -8`";dirs -p | perl -ne "chomp;s/$/ /;print unless ++\$cn==1"'
# BONUS command (beyond the 20). Alias for showing 'history' of all navd commands that add to the stack.
# Can be used in a new terminal session to quickly add recently used dirs to the navd stack.
alias navh='if [[ ! -f $HOME/.navhignore ]]; then echo -n ''>>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/ /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"'
# Note: When 'navd <relative-path>' is used, then by bash-magic the navd command puts 'navd <absolute-path>' into history,
# instead. This allows the output of "navh" to be useful regardless of the directory that is current when it is run.
#
# BONUS commands (beyond the 20). An even shorter alias for navd. An even shorter alias for navh.
alias nd='navd'
alias nh='if [[ ! -f $HOME/.navhignore ]]; then echo -n "">>$HOME/.navhignore;fi;diff --new-line-format="" --unchanged-line-format="" <(history | perl -ne "if (m/^\s*\d+\s+navd [\"~.\/]/) {s/^\s*\d+\s+/ /;s/\/$//;print}" | sort -u) <(cat $HOME/.navhignore | sort -u);echo "cat $HOME/.navhignore # (Has "`grep -c . <(sort -u $HOME/.navhignore)`" unique lines.)"'
ये उपनाम "बैश" कमांड पर आधारित हैं। "सीडी -" के सामान्य व्यवहार को बनाए रखने के लिए विशेष देखभाल की जाती है। (बहुत समय मैं "सीडी -" का उपयोग करने के बजाय या तो पुशड या नेवी के साथ परेशान करने के बजाय - क्योंकि "सीडी -" अंतिम "स्थान" पर वापस जाने के लिए बहुत आसान है जो आप थे, या केवल 2 स्थानों के बीच स्विच कर रहे थे, और यह हर जगह काम करता है जिसमें कोई इंस्टॉल नहीं है।)
बेशक, इन कमांड को उनमें से अधिक स्थाई स्थापना के लिए .bashrc फाइल में डाला जा सकता है।
alias cd=pushd
?