要查找从某个路径开始的文件,我可以使用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.