私はしばしばこのようなプロジェクトディレクトリのレイアウトを持っています。
project
`-- component-a
| `-- files...
`-- component-b
| `-- files...
`-- component-c
`-- files...
component
私は通常、ディレクトリの1つで作業します。ディレクトリにファイルがあるためです。シェルに戻るときは、通常兄弟ディレクトリに移動します。特に、各コンポーネントにスクリプトできない変更を適用する必要がある場合は、さらにそうです。このような場合には、私が働く前の兄弟や次の兄弟にも興味がありません。
コマンドを定義するprev
か、next
単にcd
前または次のディレクトリに(アルファベット順にまたはその他に)移動できますか?cd ../com<TAB><Arrow keys>
常にタイピングするのがやや昔ながらになっているからです。
ベストアンサー1
Commandlinefuソリューションを使用しないでくださいもう一つの答え:安全ではなく非効率的です。代わりに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つのプロセスはやや過度です。