可以CD成文件吗?
Is it possible to CD into a file?
我找到了我需要 cd
到(显然到父目录)的文件列表。
如果我这样做 cd ./src/components/10-atoms/fieldset/package.json
,我会得到错误 cd: not a directory:
,这是有道理的。
但是没有办法允许这样做吗?因为操作路径字符串非常麻烦,对我来说,有一个选项是完全有意义的,因为 cd
是一个目录函数,如果路径不会在文件中结束,那就太好了,它会递归地跳得更高,并从给定的路径中找到“第一个目录”。
所以 cd ./src/components/10-atoms/fieldset/package.json
会让我进入 ./src/components/10-atoms/fieldset/
而不会紧张,告诉我我选择了一个文件而不是目录。
如果您输入更长的行(或创建专用的 shell 脚本)就可以
cd $(dirname ./src/components/10-atoms/fieldset/package.json)
如果在脚本中添加它可以是:
cd $(dirname )
但是你需要这样执行:
. script_name ./src/components/10-atoms/fieldset/package.json
您可以编写一个 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您的 bash 版本可能是 4.0-4.3 并且您启用了 set -u
。)
这个函数应该可以满足您的需求:
cdd() { test -d "" && cd "" || cd $(dirname "") ; }
如果它的第一个参数 ""
是一个目录,只需 cd
进入它,
否则 cd
进入包含它的目录。
应改进此功能以考虑特殊文件,例如设备或符号链接。
你可以把这个函数放在你的 ~/.bashrc
:
function ccd() {
TP= # 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
。
我找到了我需要 cd
到(显然到父目录)的文件列表。
如果我这样做 cd ./src/components/10-atoms/fieldset/package.json
,我会得到错误 cd: not a directory:
,这是有道理的。
但是没有办法允许这样做吗?因为操作路径字符串非常麻烦,对我来说,有一个选项是完全有意义的,因为 cd
是一个目录函数,如果路径不会在文件中结束,那就太好了,它会递归地跳得更高,并从给定的路径中找到“第一个目录”。
所以 cd ./src/components/10-atoms/fieldset/package.json
会让我进入 ./src/components/10-atoms/fieldset/
而不会紧张,告诉我我选择了一个文件而不是目录。
如果您输入更长的行(或创建专用的 shell 脚本)就可以
cd $(dirname ./src/components/10-atoms/fieldset/package.json)
如果在脚本中添加它可以是:
cd $(dirname )
但是你需要这样执行:
. script_name ./src/components/10-atoms/fieldset/package.json
您可以编写一个 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您的 bash 版本可能是 4.0-4.3 并且您启用了 set -u
。)
这个函数应该可以满足您的需求:
cdd() { test -d "" && cd "" || cd $(dirname "") ; }
如果它的第一个参数 ""
是一个目录,只需 cd
进入它,
否则 cd
进入包含它的目录。
应改进此功能以考虑特殊文件,例如设备或符号链接。
你可以把这个函数放在你的 ~/.bashrc
:
function ccd() {
TP= # 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
。