Не використовуйте рішення командного рядка з іншої відповіді : це небезпечно¹ І неефективно .² Натомість, якщо ви використовуєте 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
}
¹ Він не обробляє всі можливі назви каталогів. Розбір ls
результатів ніколи не є безпечним .
², cd
мабуть, не потрібно бути надзвичайно ефективним, але 6 процесів трохи надмірно.
[[ -n $foundcwd ]]
тоді ваша відповідь однаково добре працює під bash та zsh. Дуже приємно, і дякую, що ви написали це.