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