Find 命令用于查找目录树

Find 命令用于查找目录树

GNU 是否有任何等效的命令或选项find可以搜索目录树?我想在树中向后查找具有给定名称的文件。例如,假设我在 /usr/local/share/bin 中,我想搜索一个名为foo.理想情况下,我希望命令按以下顺序查找文件:

  1. /usr/local/share/bin/foo
  2. /usr/local/share/foo
  3. /usr/local/foo
  4. /usr/foo
  5. /foo

我知道我可以编写这样的东西作为 shell 函数,但我希望有一个像 gnu 一样丰富的命令find可供我利用。

答案1

以下使用find并且仍然会从根目录向下搜索到当前目录,但只会在该单个路径上的目录内部查找:

find / -exec bash -c '[[ $PWD != "$1"* ]]' bash {} \; -prune -name foo -print

该命令的第一部分,直到-prune,将确定当前正在检查的路径名是否位于该$PWD路径中。如果它不在当前目录的路径上,则会从搜索路径中删除它。

比较是通过非常bash用于测试当前目录 是否与$PWD当前路径名的开头匹配的简短脚本。

之后的位尝试与正在检查的文件名-prune进行匹配。foo

bin示例:尝试在我当前所在的目录结构中的某个位置查找名为的内容。

$ pwd
/home/kk/local/build/ast/build/src/cmd/ksh93/sh
$ find / -exec bash -c '[[ $PWD/ != "${1%/}/"* ]]' bash {} \; -prune -name bin -print
/bin
/home/kk/local/bin
/home/kk/local/build/ast/bin

$PWD在内联脚本中对和的值的操作$1确保$1(由 找到的东西find)可以被检测为 开头的完整目录组件$PWD,而不仅仅是作为前缀字符串(这样/home/mat就不会与,例如,/home/matthew)。


bash在没有或有更快启动shell 的系统上sh

find / -exec sh -c 'case $PWD/ in ("${1%/}/"*) exit 1; esac' sh {} \; -prune -name bin -print

答案2

find_backwards () {
  test $# -ne 1 && return 2
  if [ -z "$find_backwards_recurse" ]; then
    pushd . &>/dev/null
    find_backwards_recurse=yes
  fi
  if [ -f "$1" ]; then
    echo "${PWD}/${1}"
    popd &>/dev/null
    find_backwards_recurse=
    return 0
  else
    if [ / != "$PWD" ]; then
      cd ..
      find_backwards "$1"
    else
      popd &>/dev/null
      find_backwards_recurse=
      return 1
    fi
  fi
}

start cmd:> pwd
/home/hl/tmp/tmp

start cmd:> find_backwards foo
/home/hl/tmp/foo

答案3

我不知道谁会这么做。

一种可能的脚本实现。
查找:

#!/bin/bash
d=$1
[[ -f  "$d/$2" ]] && echo  "$d/$2" 
until  [[ ${d%%*/*} ]] || [[ -z  "$d"  ]]
do
   d=${d%/*}
   [[ -f  "$d/$2" ]] && echo  "$d/$2" 
done  

用法rfind path filename

答案4

沿着目录路径向上走

f=/home/bu5hman/test; file=${f##*/}; base=${f%/*}
while [ ! -z $base ]; do
    find $base -maxdepth 1 -name $file
    base=${base%/*}
done

相关内容