私がいくつかのファイルを編集しているとしましょう。端末とGUIファイルマネージャが開いています。私は現在/my/very/long/and/winding/directory/path
ターミナルにいます。私のGUIから
/my/very/long/and/winding/directory
削除し、ターミナルに戻ってcd ..
ディレクトリがもう存在しないため、エラーが発生します。あまりありません。私はcd /my/very/long/and/winding
好きな場所に再入力することができます。しかし、入力があまりにも怠惰な場合は、まだ存在する最新のディレクトリに戻るための良い方法はありますか?
編集:cd ../../
この特別なケースには解決策があります。しかし、もう少し一般的な答えがあるかどうか疑問に思います。
答え1
リンクではなくディレクトリパスに基づいてディレクトリの1つのレベルを返すには、次の手順を実行します..
。
cd $PWD:h
または移植可能な方法:
cd "${PWD%/*}"
(引用符はzshではオプションです。他のシェルではディレクトリ名にスペースが含まれていないか\[*?
)
ディレクトリ階層をさらに上に移動するには、必要に応じて:h
繰り返します。/*
または、対応する値を入力cd $PWD
し、[Tab拡張] をクリックして$PWD
結果を手動で編集します。 (完成と行エディタの設定によっては、バインドされた/
キー(デフォルト)または(デフォルト+)を押す前にサフィックスを追加する必要があります。)$PWD
Tabexpand-or-complete
Tabexpand-or-complete-prefix
expand-word
CtrlX *
答え2
仮定がPWD
正しい場合は、次のようにZShellを終了できます。
% cd ~/tmp
% mkdir -p a/a/a/a/a/a/a/a/a/a/a
% cd !$
cd a/a/a/a/a/a/a/a/a/a/a
% rm -rf ~/tmp/a
% undir
% pwd
/Users/jmates/tmp
%
ユーザーundir
定義関数の実行は、パスチェーンループを終了します。
function undir {
local dir
dir=$PWD:h
while [[ $dir != / ]]; do
builtin cd -q $dir 2>/dev/null
if [[ $? -eq 0 ]]; then
dir=/
else
dir=$dir:h
fi
done
}
このコマンドは、シェルが維持する変数とは異なる結果をpwd
提供するため、これに依存することはできません。PWD
% mkdir -p a/a/a/a/a/a/a/a/a/a
% cd !$
cd a/a/a/a/a/a/a/a/a/a
% rm -rf ~/tmp/a
% pwd
/Users/jmates/tmp/a/a/a/a/a/a/a/a/a/a
% cd ..
% pwd
.
% echo $PWD
/Users/jmates/tmp/a/a/a/a/a/a/a/a/a
%
そうでなければ、zsh
間違いなく他の解決策が必要になるでしょう。
答え3
現在のディレクトリを削除すると、現在のディレクトリが名前なしで存在し、残りの世界に関連付けられていないため、cd ..は機能しません。だから..もう存在しません。
すべてのbourneシェルは、$ PWDのコピーを作成し、パスをナビゲートする関数の作成を許可する必要があります(まだ存在する限り)。