Не используйте решение командной строки из другого ответа : оно небезопасно и неэффективно. Вместо этого, если вы используете bash
, просто используйте следующие функции. Чтобы сделать их постоянными, поместите их в свой .bashrc
. Обратите внимание, что я использую порядок глобусов, потому что он встроенный и простой. Обычно порядок глобусов является алфавитным в большинстве локалей. Вы получите сообщение об ошибке, если нет следующего или предыдущего каталога для перехода. В частности, вы увидите ошибку, если попытаетесь next
или находитесь prev
в корневом каталоге /
.
## bash and zsh only!
# functions to cd to the next or previous sibling directory, in glob order
prev () {
# default to current directory if no previous
local prevdir="./"
local cwd=${PWD##*/}
if [[ -z $cwd ]]; then
# $PWD must be /
echo 'No previous directory.' >&2
return 1
fi
for x in ../*/; do
if [[ ${x#../} == ${cwd}/ ]]; then
# found cwd
if [[ $prevdir == ./ ]]; then
echo 'No previous directory.' >&2
return 1
fi
cd "$prevdir"
return
fi
if [[ -d $x ]]; then
prevdir=$x
fi
done
# Should never get here.
echo 'Directory not changed.' >&2
return 1
}
next () {
local foundcwd=
local cwd=${PWD##*/}
if [[ -z $cwd ]]; then
# $PWD must be /
echo 'No next directory.' >&2
return 1
fi
for x in ../*/; do
if [[ -n $foundcwd ]]; then
if [[ -d $x ]]; then
cd "$x"
return
fi
elif [[ ${x#../} == ${cwd}/ ]]; then
foundcwd=1
fi
done
echo 'No next directory.' >&2
return 1
}
Handle Он не обрабатывает все возможные имена каталогов. Разбор ls
вывода никогда не бывает безопасным .
², cd
вероятно, не должно быть ужасно эффективным, но 6 процессов немного чрезмерно.
[[ -n $foundcwd ]]
то ваш ответ будет одинаково хорошо работать в bash и zsh. Очень приятно, и спасибо, что написали это.