有没有办法在反向递归搜索中找到文件?

Cor*_*ein 13 bash find

所以说我在一个文件结构深处的目录中,比如

/home/cory/projects/foo/bar/bash/baz
Run Code Online (Sandbox Code Playgroud)

我知道,无论是在当前文件夹baz或文件夹的一个上面我的(如homecoryprojectsfoobar,或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。