我试图找到我的 .csv 文件,然后 cd 进入他们的目录:
find Documents/notes -type f -name "*.csv" | head -1 | xsel -b
这会将第一个文件目录复制到我的剪贴板中,然后我想运行:
cd $(xsel -b)
但我当然不能,因为它包含不是目录的文件名。
有没有办法省略文件名?有一个更好的方法吗?
答案1
使用bash
shell,启用**
模式(匹配*
,但也到达/
路径名中的过去),然后展开模式Documents/notes/**/*.csv
,然后cd
到第一个匹配的目录:
shopt -s globstar
set -- Documents/notes/**/*.csv
cd "$(dirname "$1")" # or: cd "${1%/*}"
对于zsh
,它已经**
默认启用了该模式,这可以缩短为
cd Documents/notes/**/*.csv([1]:h)
glob 限定符([1]:h)
返回给定模式的第一个匹配的目录名称(“h”,如“路径头”)。将此限定符更改为(.[1]:h)
以使模式仅匹配常规文件(或此类文件的符号链接)。
答案2
是的,仅使用find
(需要-quit
支持):
dir=$(find . -name '*.csv' -print -quit)
cd "$(dirname "$dir")"
或者
cd "$(dirname "$(find . -name '*.csv' -print -quit)")"
它在第一场比赛时就中断了。
-quit
:
立即退出(如果没有发生错误,则返回值为零)。这与 -prune 不同,因为 -prune 仅适用于修剪目录的内容,而 -quit 只是使 find 立即停止。没有子进程将继续运行。任何由 -exec ... + 或 -execdir ... + 构建的命令行都会在程序退出之前调用。执行-quit后,将不再处理命令行中指定的文件。例如,
find /tmp/foo /tmp/bar -print -quit
将仅打印/tmp/foo
. -quit 的一种常见用法是在找到所需内容后停止搜索文件系统。