Linux 的“find”命令(速度很慢)有一个选项“-ls”,可以像“ls -l”命令一样显示大小、日期等。但“locate”命令似乎没有这个功能。那么我怎样才能用locate获得同等的功能呢?
我使用反引号将locate的输出传递给ls,如下所示:
ls -al `locate -e somefile`
…只要 somefile 存在,它就会起作用。但如果 somefile 不存在,它会给我一个完整的目录列表。
如果我这样做:
ls -al `locate -e somefile` thisfileneverexists
...那么它就可以工作了,如果你不介意错误行的话:
ls: cannot access thisfileneverexists: No such file or directory
…这让我们想到了一个显而易见但极其丑陋的解决方法:
ls -al `locate -e somefile` thisfileneverexists 2>/dev/nul
这可行,但肯定有更好的方法!
答案1
使用xargs
。这将以一系列参数作为输入,并对它们执行操作:
locate -eb0P somefile | xargs -r0 ls -ald
ls -ald
xargs 将使用locate的结果作为参数执行命令。
该-e
开关告诉locate检查在数据库中找到的文件是否真的存在,并忽略不存在的文件。
该-b
开关告诉定位仅匹配基本名称。
(零)开关-0
告诉locate生成空分隔符而不是空格(因此它可以处理包含空格的文件名)
该-P
开关告诉locate列出损坏的符号链接
该-r
开关告诉 xargs,如果没有传入任何内容(即,当locate没有返回任何内容)则不要执行该命令。
该-0
开关告诉 xargs 使用空值而不是空格作为分隔符
该-a
开关告诉 ls 列出以“。”开头的文件。
该-d
开关告诉 ls 列出目录而不是其内容
答案2
将结果存储locate
在变量中,检查它是否有任何值,然后查看。
f=`locate ...`
[ "$f" ] && ls -al "$f"
您无法locate
直接获取此信息的原因是它不在使用的数据库中locate
。
答案3
您还可以循环输出locate
:
locate somefile | while IFS= read -r i; do ls -la "$i"; done