从已删除的目录中撤退

从已删除的目录中撤退

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

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

答案1

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

cd $PWD:h

或者便携式方法:

cd "${PWD%/*}"

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

根据需要重复: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命令,因为它给出的结果与 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
% 

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

答案3

如果您删除了所在的目录,则 cd .. 将无法工作,因为当前目录的存在没有名称,也没有与世界其他地方的连接。所以..不再存在。

每个 bourne shell 都应该允许编写一个函数来创建 $PWD 的副本并遍历该路径(只要它仍然存在)。

相关内容