使用locate仅查找包含字符串“foo”的目录

使用locate仅查找包含字符串“foo”的目录

是否可以使用该locate命令仅查找目录?换句话说,我想搜索目录,并排除任何非目录的结果,例如文件或文件的符号链接。

虽然没有必要,但我希望解决方案也能返回到其他目录(但同样不是文件)的符号链接。

最后,我想排除 foo 中的目录,但有一个例外。如果 foo 的子目录包含一个名为 foo 的子目录,我希望它也被返回。

如果存在以下文件和目录...

/home/foo/
/home/foo/foo.txt
/home/foo/someotherdir/
/home/foo/someotherdir/food/
/food/
/var/www/foo -> /home/foo/
/var/www/food -> /home/food/index.html

输出仅包含...

/home/foo/
/home/foo/someotherdir/food/
/food/
/var/www/foo -> /home/foo/

提前致谢。

编辑:感谢您的回复。我非常谨慎地将此标题命名为命令locate而不是find

答案1

可能有点棘手,但事实就是如此:

locate foo | xargs file -NF '|' |grep '| directory' | sed 's/| directory//g'

答案2

Locate 仅读取预先准备好的数据库而不是文件系统。

使用 find

包含 foo 的目录

find /path -name '*foo*' -type d

包含 foo 的链接,您需要读取该链接并测试目标是否是需要脚本的目录

#!/bin/bash
f=$(readlink $1)
if [ -d "$f" ]
then
    echo $1
fi

像这样使用

find /path -name '*foo*' -type l -exec script {} \;

答案3

locate foo | sed 's%/[^/]*$%/%'

编辑:这只是将最后一个斜线后的所有信息都删除。

答案4

这个可以完成这个工作:

locate foo | grep "foo[^/]*/$"

它将比其他可用选项快得多,find但标准locate警告是它可能会过期 24 小时。

相关内容