定位与查找

定位与查找

我想从当前目录中获取所有文件,并将它们交给“locate”来检查它们是否在其他地方。所以我开始

find -maxdepth 1 -type f -name "libd*" -exec locate {} ';'

但这不起作用,因为 find 返回的名称形式类似于“./libdrm.so”,而locate 不适用于前导点。所以我认为locate -b应该有帮助:

find -maxdepth 1 -type f -name "libd*" -exec locate -b {} ';'

不幸的是,locate -b ./libdrm.so 不起作用,我认为这是一个错误。所以我用 basename 尝试了一下:

find -maxdepth 1 -type f -name "libd*" -exec locate \`basename {}\` ';'

这也不起作用,因为 `basename {}` 首先被解析,结果是“-exec located '{}' ';'”。

知道如何将“locate `basename {}`”传递给 exec 吗?

答案1

由于您只想搜索实际文件夹中的文件,您也可以使用

locate libd*

或者类似下面的内容,但没有多大意义。

ls libd* | xargs locate
locate $(ls libd*)

如果您想使用 find,您也可以使用*而不是.,但我也会引用{}

find * -maxdepth 1 -name "libd*" -exec locate "{}" ';'

最后,如果您想要包含点文件,也就是带有 glob 的隐藏文件。

shopt -s dotglob
find * -maxdepth 1 -name "libd*" -exec locate "{}" ';'
shopt -u dotglob

答案2

我建议

find . -maxdepth 1 -name "libd*" -exec sh -c 'for f; do locate "${f##*/}"; done' sh {} +

或者

find . -maxdepth 1 -name "libd*" -printf '%f\0' | while read -rd '' f; do locate "$f"; done

答案3

这对我有用:

find -maxdepth 1 -type f -name "libd*" | sed -r 's/^\.\///' | xargs locate

sed -r 's/^\.\///'./:从find命令中删除

答案4

find -maxdepth 1 -name "libd*" | sed 's^\./^^' | locate -

这个解决方案肯定不是优雅的,但它对我来说是有效的——sed 's^\./^^'只需从每行的开头删除“./”。

如果要在中使用多个命令-exec,请这样做:

find -maxdepth 1 -name "libd*" -exec bash -c 'basename $1 | locate -' {} \;

相关内容