UNIX:在$ PWD以上的目录中查找文件

时间:2010-09-29 23:46:49

标签: bash unix shell find posix

我想找到一个具有特定名称的文件,但是在上面的中搜索当前的而不是下面的文件。

我想要类似于:(功能除外)

$ cd /some/long/path/to/my/dir/

$ find -maxdepth -1 -name 'foo'
/some/long/path/to/foo
/some/foo

首选shell脚本或单行。


在回答几个问题时,上面的例子和真实发现之间的区别在于搜索是从当前目录向上进行的(并且-maxdepth不带负参数)

4 个答案:

答案 0 :(得分:6)

有趣的问题,所以我试着给出一个有趣的答案:)

find `( CP=${PWD%/*}; while [ -n "$CP" ] ; do echo $CP; CP=${CP%/*}; done; echo / ) ` -mindepth 1 -maxdepth 1 -type f -name 'foo'

有点精心设计,'while'循环将尝试生成当前目录的父路径列表。 while循环不会生成/,所以我添加了额外的'echo /'来覆盖它。

最后,封闭的“find”命令是相当基本的用法。

答案 1 :(得分:2)

您可以使用Parameter Expansion:

path="/some/long/path/to/my/dir"

while [ -n "$var" ]
do
  find $path -maxdepth 1 -name 'foo' 
  path="${var%/*}"
done

答案 2 :(得分:2)

这很有效,但并不像我希望的那么简单。

FILE=foo
DIR=$PWD
while [[ $DIR != '/' ]]; do
    if [[ -e $DIR/$FILE ]]; then
        echo $DIR/$FILE
    else
        DIR=`dirname $DIR`
    fi
done

答案 3 :(得分:1)

如果您的意思是排除当前目录:

find / -name 'foo' ! -iwholename "$PWD*"

如果你的意思是:在路径中的任何目录中直接匹配,这将有效,但我的bash-fu不足以轻松获得目录列表:

find  /some/ /some/long /some/long/path/ /some/long/path/to/ /some/long/path/to/my -maxdepth=1 -name='foo'

所以我们需要的是一种将/some/long/path/to/my/dir改为
的方法 /some/ /some/long /some/long/path/ /some/long/path/to/ /some/long/path/to/my