我找到了cd
所需的文件列表(显然是父目录)。
如果我cd ./src/components/10-atoms/fieldset/package.json
遇到错误cd: not a directory:
,这是有道理的。
但是没有办法允许这种情况吗?因为操作路径字符串非常繁琐,对我而言,为此选择一个选项是很有意义的,因为cd
是目录函数,而且很酷,如果路径不会以文件结尾,它将以递归方式跳到更高位置,并从给定路径中找到“第一个目录”。
我找到了cd
所需的文件列表(显然是父目录)。
如果我cd ./src/components/10-atoms/fieldset/package.json
遇到错误cd: not a directory:
,这是有道理的。
但是没有办法允许这种情况吗?因为操作路径字符串非常繁琐,对我而言,为此选择一个选项是很有意义的,因为cd
是目录函数,而且很酷,如果路径不会以文件结尾,它将以递归方式跳到更高位置,并从给定路径中找到“第一个目录”。
您可以编写一个shell函数来实现它。
cd() {
local args=() arg
for arg in "$@"; do
if [[ $arg != -* && -e $arg && ! -d $arg ]]; then
args+=("$(dirname "$arg")")
else
args+=("$arg")
fi
done
builtin cd ${args[0]+"${args[@]}"}
}
如果希望它成为默认行为,则将其放入~/.bashrc
中。 Shell脚本或其他程序不会继承它,因此它们不会受到影响。
它修改cd
的参数,用父目录替换所有文件名。带有前划线的选项将保留。 command cd
调用了内置的底层cd
,因此我们不会陷入递归循环中。
(这是什么邪恶的野兽:${args[0]+"${args[@]}"}
?就像"${args[@]}"
,它扩展了参数数组,但避免了在猛烈打击的情况下触发a bash bug with empty arrays的情况。版本是4.0-4.3,并且您已启用set -u
。)
此功能应满足您的需求:
cdd() { test -d "$1" && cd "$1" || cd $(dirname "$1") ; }
如果第一个参数"$1"
是目录,则仅将cd
放入其中,
否则cd
进入包含它的目录。
应改进此功能以考虑特殊文件,例如设备或符号链接。
,您可以输入更长的行(或创建专用的shell脚本)
cd $(dirname ./src/components/10-atoms/fieldset/package.json)
如果您将其添加到脚本中,则可以是:
cd $(dirname $1)
但是您需要以这种方式执行它:
. script_name ./src/components/10-atoms/fieldset/package.json
,
您可以将此函数放在~/.bashrc
中:
function ccd() {
TP=$1 # destination you're trying to reach
while [ ! -d $TP ]; do # if $TP is not a directory:
TP=$(dirname $TP) # remove the last part from the path
done # you finally got a directory
cd $TP # and jump into it
}
用法:ccd /etc/postfix/strangedir/anotherdir/file.txt
将带您进入/etc/postfix
。