![从已删除的目录中撤退](https://linux22.com/image/71636/%E4%BB%8E%E5%B7%B2%E5%88%A0%E9%99%A4%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%92%A4%E9%80%80.png)
假设我正在编辑一些文件。我(比如说)打开了一个终端和一个 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
到其值并手动编辑结果。 (根据您的补全和行编辑器设置,您可能需要在按 之前添加一个/
后缀,以按您绑定到的键(默认) 或或(默认+ )。)$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
命令,因为它给出的结果与 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 的副本并遍历该路径(只要它仍然存在)。