我想找到一个具有特定名称的文件,但是在上面的中搜索当前的而不是下面的文件。
我想要类似于:(功能除外)
$ cd /some/long/path/to/my/dir/
$ find -maxdepth -1 -name 'foo'
/some/long/path/to/foo
/some/foo
首选shell脚本或单行。
在回答几个问题时,上面的例子和真实发现之间的区别在于搜索是从当前目录向上进行的(并且-maxdepth不带负参数)
答案 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