削除されたディレクトリから後退

削除されたディレクトリから後退

私がいくつかのファイルを編集しているとしましょう。端末と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結果を手動で編集します。 (完成と行エディタの設定によっては、バインドされた/キー(デフォルト)または(デフォルト+)を押す前にサフィックスを追加する必要があります。)$PWDTabexpand-or-completeTabexpand-or-complete-prefixexpand-wordCtrlX *

答え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のコピーを作成し、パスをナビゲートする関数の作成を許可する必要があります(まだ存在する限り)。

関連情報