退出删除的目录

Sau*_*ode 5 command-line

假设我正在编辑一些文件。我有(说)一个终端打开和一个 gui 文件管理器。我目前在/my/very/long/and/winding/directory/path终端。在我的 gui 中,我/my/very/long/and/winding/directory 在终端中删除 Back,我尝试cd ..并收到错误消息,因为该目录不再存在。没什么大不了。我可以打字cd /my/very/long/and/winding回到我想去的地方。但是,如果我懒得输入,是否有返回到最近仍然存在的目录的好方法?

编辑:cd ../../在这种特殊情况下是一种解决方案。但我想知道是否有更一般的答案,我不知道我需要退多少步。

Gil*_*il' 6

根据目录路径而不是..链接返回一级目录:

cd $PWD:h
Run Code Online (Sandbox Code Playgroud)

或便携式方法:

cd "${PWD%/*}"
Run Code Online (Sandbox Code Playgroud)

(zsh 中的引号是可选的;如果目录名称不包含空格或 ,则其他 shell 中的引号是可选的\[*?

根据需要重复:h/*多次以在目录层次结构中进一步向上。

或者,键入cd $PWD然后按Tab以扩展$PWD到其值并手动编辑结果。(根据您的完成和行编辑器设置,您可能需要在按之前添加/after ,以按您绑定的键(默认)或或(默认+ )。)$PWDTabexpand-or-completeTabexpand-or-complete-prefixexpand-wordCtrlX *


thr*_*rig 3

假设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
% 
Run Code Online (Sandbox Code Playgroud)

自定义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
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不能依赖该pwd命令,因为它给出的结果与 shell 维护的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
% 
Run Code Online (Sandbox Code Playgroud)

如果不是这样,zsh毫无疑问需要其他解决方案。