使用bash按目录树的名称查找文件

时间:2012-02-21 11:37:10

标签: bash find

使用bash,如何在pwd目录树的某处找到具有特定名称的文件?

更清楚。我想找到一个位于我的工作目录根目录中的文件,但我不知道root的位置,而我的pwd可能位于根目录下的任何位置。

3 个答案:

答案 0 :(得分:12)

查找file.txt到root

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

我在〜/ .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'以及您提供的可选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"是"发现"向后。
  • 该函数是一个有限循环(不是递归),不创建子shell,并尽可能使用Bash内置函数来提高速度。
  • 列出了每个升序目录级别的所有匹配。
  • ls -opts是可选的,但必须在所需的搜索参数之前。
  • 搜索参数可以是文件或目录。
  • 如果搜索参数是目录,请包含ls -opt' -d'将结果限制为目录名而不是内容。
  • 该函数返回退出代码
    • 0,如果至少有一次点击,
    • 1,如果没有提供帮助参数,
    • 2,如果没有找到。