如何在没有文件名本身的情况下获取文件路径

如何在没有文件名本身的情况下获取文件路径

我试图找到我的 .csv 文件,然后 cd 进入他们的目录:

find Documents/notes -type f -name "*.csv" | head -1 | xsel -b

这会将第一个文件目录复制到我的剪贴板中,然后我想运行:

cd $(xsel -b) 

但我当然不能,因为它包含不是目录的文件名。

有没有办法省略文件名?有一个更好的方法吗?

答案1

使用bashshell,启用**模式(匹配*,但也到达/路径名中的过去),然后展开模式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 的一种常见用法是在找到所需内容后停止搜索文件系统。

相关内容