是否有“向上”的发现?

是否有“向上”的发现?

要查找从某个路径开始的文件,我可以使用find <path> ...。如果我想“向上”查找,即在父目录中,以及它的父目录中,并且......,是否有等效的工具?

文件夹结构的预期用途如下:

/
/abc
/abc/dce/efg/ghi


$ cd /abc/dce/efg/ghi
$ touch ../../x.txt
$ upfind . -name X*
../../x.txt
$ upfind . -name Y*
$

答案1

x="$(pwd)"; while [ "$x" != "/" ]; do if [ -e "${x}/X.txt" ]; then echo $x; fi; x="$(dirname "$x")"; done

答案2

为什么不直接向下递归find/?它们都会搜索整个文件空间。还是你要一个向上递归的但随后并没有进入在该搜索中找到的目录

答案3

如果您想要文件的父目录,可以使用find以下-printf %h参数

find /abc -name X.txt -printf "%h\n"
/abc/dce
  • %H

    文件名的前导目录(除最后一个元素外的所有元素)。如果文件名不包含斜杠(因为它在当前目录中),则 %h 说明符将扩展为“。”。

答案4

根据主意@Womble,我写了一个小脚本来达到这个目的:

#!/bin/bash
#
# rfind: finds a file in one of the parent directories

needle=$1 
current_dir=$(pwd) 
path=

while [ "$current_dir" != "$(dirname $current_dir)" ]; do 
    if [ -e "${current_dir}/$needle" ]; then 
        echo $path$needle
        exit 0
    else 
        path=../$path
        current_dir="$(dirname "$current_dir")"
    fi
done

if [ ! "$current_dir" != "$(dirname $current_dir)" ]; then
    echo "rfind: file $needle not found" >&2
    exit 1
fi

并在我自己的 ~/bin 目录中将其命名为“rfind”。它起到了以下作用:

/tmp $ mkdir -p x/y/z
/tmp $ cd x/y/z/
/tmp/x/y/z $ rfind a.txt || echo "not found."
rfind: file a.txt not found
not found.
/tmp/x/y/z $ touch ../../a.txt
/tmp/x/y/z $ rfind a.txt || echo "not found."
../../a.txt
/tmp/x/y/z $ 
/tmp/x/y/z $ cd ..
/tmp/x/y $ mkdir z2
/tmp/x/y $ cd z
/tmp/x/y/z $ touch ../z2/a.txt
/tmp/x/y/z $ rfind a.txt || echo "not found."
../../a.txt
/tmp/x/y/z $ rm ../../a.txt
/tmp/x/y/z $ rfind a.txt || echo "not found."
rfind: file a.txt not found
not found.

相关内容