在Bash中向上遍历目录树,按名称查找文件。

17

使用 bash,我如何在当前目录的上层目录树中查找具有特定名称的文件?

更明确地说,我想查找位于我的工作目录根目录中的文件,但是我不知道根目录在哪里,而且我的 pwd 可能在根目录下面的任何位置。


你的根目录在哪里不清楚是什么意思?你能否简单举个例子说明一下你的目录树长什么样子?你当前的工作目录是什么,你想要在哪里搜索文件?通常情况下,你可以以root用户身份运行 find / -name <filename> 命令来搜索整个系统。 - Eugene S
3个回答

19

在根目录查找file.txt

x=`pwd`
while [ "$x" != "/" ] ; do
    x=`dirname "$x"`
    find "$x" -maxdepth 1 -name file.txt
done

2
太棒了@kev。我刚刚在循环中添加了一个break:x=`pwd`; while [ "$x" != "/" ] ; do x=`dirname "$x"`; echo "$x"; if [ `find "$x" -maxdepth 1 -name erm.properties` ]; then break; fi; done - Niel de Wet
这对我似乎不起作用。它只是一直重复执行while循环,永远不会停止。x从当前路径到“/” ,但之后它又重新开始了。 - trans
没关系。我的问题源于创建一个别名,然后在别名内部调用该别名。 - trans
1
不错,你也可以使用 if [ -f "$x/erm.properties" ] .. 而不是 find。 - patrickdavey

10
local DIR=$(pwd)
while [ ! -z "$DIR" ] && [ ! -f "$DIR/myFile.txt" ]; do
    DIR="${DIR%\/*}"
done
echo $DIR/myFile.txt

1
简洁明了的解决方案 :+1: - Niel de Wet
2
有时候跟随实际路径而不是链接更有意义。在这种情况下,将第一行替换为:DIR = $(realpath $PWD) - Marcel Sonderegger

4

我在我的~/.bashrc文件中定义了以下函数:

dnif () { 
    # Recursively list a file from PWD up the directory tree to root
    [[ -n $1 ]] || { echo "dnif [ls-opts] name"; return 1; }
    local THERE=$PWD RC=2
    while [[ $THERE != / ]]
        do [[ -e $THERE/${2:-$1} ]] && { ls ${2:+$1} $THERE/${2:-$1}; RC=0; }
            THERE=$(dirname $THERE)
        done
    [[ -e $THERE/${2:-$1} ]] && { ls ${2:+$1} /${2:-$1}; RC=0; }
    return $RC
}

该命令将在当前目录到根目录的每个目录中搜索您提供的名称,并进行列表化显示,同时可使用您提供的可选 ls -options。例如输出:

me@host:~/dev/example
$ dnif; echo $?
dnif [ls-opts] name
1
me@host:~/dev/example
$ dnif -alp nonesuch; echo $?
2
me@host:~/dev/example
$ dnif -alp .bashrc; echo $?
-rw-r--r-- 1 me mine 3486 Apr  3  2012 /home/me/.bashrc
0
me@host:~/dev/example
$ dnif -d .
/home/me/dev/example/.
/home/me/dev/.
/home/me/.
/home/.
/.

请注意:
  • "dnif" 是 "find" 倒过来拼写的。
  • 此函数是一个有限循环(不是递归),不创建子 shell,并尽可能使用 Bash 内置以加快速度。
  • 列出每个上升目录级别的所有命中结果。
  • ls -opts 是可选项,但必须在所需的搜索参数之前。
  • 搜索参数可以是文件或目录。
  • 如果搜索参数是目录,请包括 ls -opt '-d' 以将结果限制为目录名称而不是内容。
  • 该函数返回退出代码
    • 如果至少有一个命中,则返回 0,
    • 如果没有提供参数以获取帮助,则返回 1,以及
    • 如果未找到任何内容,则返回 2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接