所以说我在一个文件结构深处的目录中,比如
/home/cory/projects/foo/bar/bash/baz
Run Code Online (Sandbox Code Playgroud)
我知道,无论是在当前文件夹baz
或文件夹的一个上面我的(如home
,cory
,projects
,foo
,bar
,或bash
)有一个名为文件happy
。如何在不搜索大量额外文件夹的情况下找到该文件?
use*_*own 25
#!/bin/bash
function upsearch () {
test / == "$PWD" && return || test -e "$1" && echo "found: " "$PWD" && return || cd .. && upsearch "$1"
}
Run Code Online (Sandbox Code Playgroud)
此函数将从当前目录向上走。请注意,它是一个函数,并且会在遍历时更改目录。它将停在它找到文件的目录中,如果没有,它将走到根目录 / 。
如果在根目录中找不到该文件,您可能希望将其更改为脚本而不是函数,并且可能会跳回。
如果您永远不想 cd 到目录:
upsearch () {
slashes=${PWD//[^\/]/}
directory="$PWD"
for (( n=${#slashes}; n>0; --n ))
do
test -e "$directory/$1" && echo "$directory/$1" && return
directory="$directory/.."
done
}
Run Code Online (Sandbox Code Playgroud)
如果文件在 /home/cory/ 中,这将导致类似 /home/cory/a/b/c/../../../happy 的结果。如果你需要一个干净的路径,你可以做一些
cd "$directory"
echo "$PWD"
cd -
Run Code Online (Sandbox Code Playgroud)
关于成功。
要将搜索限制为常规文件并排除目录、符号链接等,您可以将测试更改为 -f 而不是 -e。