是否有 Unix 命令或 shell 脚本接受文件参数并移动到包含的目录,完全忽略参数的文件部分?
答案1
您可以创建一个函数,如下所示:
cd_to_file_location() {
location=$(dirname -- "$1")
cd -- "$location"
}
# test it out
$ mkdir /tmp/foodir
$ touch /tmp/foodir/a
$ cd_to_file_location /tmp/foodir/a
$ pwd
/tmp/foodir
答案2
在zsh
:
cdparent() cd -- $1:h
将定义一个cdparent
函数,将当前工作目录更改为h
第一个参数的目录部分 (ead)。
您还可以这样做:
cd some/file(:h)
这里:h
再次在 glob 限定符中使用来检索给定文件的头部。
该:h
修饰符来自 70 年代的 csh,可用于参数扩展和历史替换。在 中zsh
,它可以应用于那些加上全局限定符的情况。在 中bash
,它只能应用于历史替换。其中一些修饰符(包括:h
)也可以在 中使用vim
,例如,您可以:cd %:h
在其中 chdir 到当前编辑的文件的目录中。
(这家长上面的措辞可能会有点误导cdparent ..
,例如,这将执行 acd .
而不是 a cd ../..
as家长可以建议)。
答案3
您可以使用一个函数来检查目标路径是否是目录,如果不是,它将从路径中获取目录名称并 cd 到该目录。例如:
mycd()
{
if [ ! $# -eq 1 ]
then
printf "Usage: mycd <PATH>\n" >&2
return
fi
if [ ! -d "$1" ]
then
dest="$(dirname -- "$1")"
set -- "$dest"
fi
cd -- "$1"
}
它具有足够的通用性,可以处理目录和文件路径,并且由于它使用 real,因此cd
您始终可以使用以下命令返回到上一个目录cd -
:
$ mkdir /tmp/test-dir/
$ touch /tmp/test-dir/FILE
$ mycd /tmp/test-dir/FILE
$ pwd
/tmp/test-dir
$ mycd /tmp/
$ pwd
/tmp
$ cd -
/tmp/test-dir
$ pwd
/tmp/test-dir
答案4
你在找吗?
cd "${dirname "$1"}"
您也可以根据需要使用pushd
代替。cd