我经常深入目录树,上下移动以执行各种任务。有没有比“cd ../../../..”更有效的方法?
我当时的想法是这样的:如果我在 /foo/bar/baz/qux/quux/corge/grault 中,并且想要转到 /foo/bar/baz,我想执行类似“cdto baz”的操作。我可以为此编写一些 bash 脚本,但我首先想知道它是否已经以某种形式存在。
答案1
这是一个可以完成您想要的操作的函数:
cdto () { cd "${PWD%/$1/*}/$1"; }
这是另一个方便的方法:
c2 () {
local path num
if (($# != 0))
then
path='./'
fi
if [[ -z ${1//.} ]]
then
num=${#1}
elif [[ -z ${1//[[:digit:]]} ]]
then
num=$1
else
echo "Invalid argument"
return 1
fi
for ((i=0; i<num-1; i++))
do
path+='../'
done
cd $path
}
用法:
c2 . # same as cd .
c2 .. # same as cd ..
c2 ... # same as cd ../..
c2 3 # also same as cd ../..
c2 # same as cd (which is the same as cd ~)
我认为其中一个 shell 曾经具有累积的点点点功能(我刚刚检查了 Vista,它没有此功能,尽管 Google 声称某些版本的 Windows 有此功能)。
编辑
Bash 的一个未公开的功能是,函数名中可以接受很多字符。因此,你可以这样做:
.. () { cd ..; }
... () { cd ../..; }
.... () { cd ../../..; }
..... () { cd ../../../..; }
答案2
如果你经常“去某处”然后想“回去”,你可以使用bash
's目录堆栈:pushd
更改到特定目录并popd
返回原来的位置。
[/tmp]$ mkdir -p some/deep/directory/tree
[/tmp]$ pushd some/deep/directory/tree
/tmp/some/deep/directory/tree /tmp
[/tmp/some/deep/directory/tree]$ pushd ..
/tmp/some/deep/directory /tmp/some/deep/directory/tree /tmp
[/tmp/some/deep/directory]$ popd
/tmp/some/deep/directory/tree /tmp
[/tmp/some/deep/directory/tree]$ popd
/tmp
[/tmp]$
否则,$CDPATH
按照 JRobert 的建议进行调整。
答案3
创建一个 CDPATH。它对“cd”的作用与 PATH 对查找可执行文件的作用相同。从“man bash”开始:
CDPATH cd 命令的搜索路径。这是一个以冒号分隔的目录列表,shell 在其中查找 cd 命令指定的目标目录。示例值为“.:~:/usr”。
答案4
“cd -” 返回您上次所在的目录。
dan@home:/home/dan/ $ cd test/2009/apt/
dan@home:/home/dan/test/2009/apt/ $ cd -
dan@home:/home/dan/ $