想知道是否存在任何 *nix 命令(或脚本)允许我将目录向后更改到与特定名称匹配的文件夹。
例如,假装pwd
是:
〜/工作区/项目/子项目/ src / main / java
我想要输入类似以下内容的内容:
cd ..proj
并立即返回到该proj
文件夹。(而不必键入cd ../../../../
)
PS:有了自动完成功能,我就可以这样做:cd ..pr<tab>
这也太棒了。
答案1
当然不是,但是这里有一些有用的技巧。
使用
cd -
。这会将您移动到上一个目录。使用
pushd
:$ pushd foo/bar/baz/foobar/babar/ /home/terdon/foo/bar/baz/foobar/babar ~/foo/bar/baz/foobar/babar ~ $ pwd /home/terdon/foo/bar/baz/foobar/babar $ pushd ~/foo/ ~/foo ~/foo/bar/baz/foobar/babar ~ $ pushd +1 ~/foo/bar/baz/foobar/babar ~ ~/foo $ pwd /home/terdon/foo/bar/baz/foobar/babar
使用
CDPATH
变量。这允许您使用Tab从任何地方自动完成目录名称,只要这些目录在中定义即可CDPATH
。例如,假设我有一个名为 的目录,~/foo
其中包含 4 个子目录:$ tree . ├── dir1 ├── dir2 ├── dir3 └── dir4
现在,如果我在目录中
~/
,输入dir
和Tab将不会自动完成,因为它们在下~/foo
。但是如果我添加~/foo
到,它就会自动完成CDPATH
:$ CDPATH="~/foo" $ cd dir ## Hit tab here dir/ dir1/ dir2/ dir3/ dir4/
使用搜索父目录的功能来查找要去的地方。只需将这些行添加到您的目录中
~/.bashrc
,然后运行source ~/.bashrc
或打开一个新终端:find_target(){ ## The target directory _target=$1 ## Iterate through the parent directories printf "%s\n" "$PWD" | sed -r 's#/#/\n#g' | while read parent_dir; do ## Check if the target directory exists under this ## parent directory and if it does, print the ## target's path and break the loop. _path="${_path}${parent_dir}" [ -d "${_path}${_target}" ] && echo "${_path}${_target}" && break done } ## If the value passed as an argument to ## this function exists as a subdirectory of ## any of the current directory's parents, ## cd into it. Else, fail silently. pcd(){ cd "$(find_target $1)" 2>/dev/null }
现在您就可以运行
pcd baz
,并且您将被移动到../../../baz
。该函数将找到名为 的第一个目录baz
,它是您当前任何目录的子目录。注意事项:
- 它不会递归检查子目录。例如,如果您位于
~/foo/bar/baz/
,pcd foo
则会将您移动到../../foo
,但它不会查找../bar/foo
是否存在这样的目录。 - 它将移动到找到的第一个目录(最上面的目录)。
- 它不会递归检查子目录。例如,如果您位于