我想从当前目录中获取所有文件,并将它们交给“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 -' {} \;