![16.04 Locate 未在 /mnt 中找到文件](https://linux22.com/image/886218/16.04%20Locate%20%E6%9C%AA%E5%9C%A8%20%2Fmnt%20%E4%B8%AD%E6%89%BE%E5%88%B0%E6%96%87%E4%BB%B6.png)
我安装了一个 16.04,其中下载文件夹指向辅助硬盘(显示Downloads -> /mnt/data/Downloads
)。当我运行locate
搜索文件时,它没有显示此驱动器上的任何文件。我运行了sudo updatedb
并检查了我的updatedb.conf
(我没有看到任何排除/mnt
目录或我正在寻找的文件)
对我来说有趣的是当我cd /mnt/data/Downloads
跑定位我可以看到此目录中的所有内容,但看不到主驱动器上的所有内容。这几乎就像 Ubuntu 有两个不同的定位数据库,具体取决于我所在的驱动器。
我该如何补救这种情况?
额外的:这是我的updatedb.conf
PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs /var/lib/schroot"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ecryptfs fusesmb devtmpfs"
我尝试跑步sudo locate
,但结果并没有改变。 我尝试跑步mlocate
,sudo mlocate
但结果并没有改变。
我还尝试查找另一个updatedb.conf
文件,但一无所获。
更新 1:辅助驱动器上的文件系统是 ext4。
更新 2:也没有加密任何东西。我在 Google 上搜索了一下,发现这对一些用户来说是个问题。
更新 3:我现在更困惑了。我试图找到我机器上的所有 .iso 文件,结果如下:
@:~$ 定位 FreeNAS
/mnt/data/Downloads/FreeNAS-9.3-RELEASE.iso
@:~$ 定位 *.iso
/home/hudsona/ubuntu-16.04.1-server-amd64.iso
@:~$ 定位 iso
/主页//ubuntu-16.04.1-服务器-amd64.iso
/mnt/data/Downloads/FreeNAS-9.3-RELEASE.iso
(以及许多其他结果)
@:~$ find .-type f-name "*.iso"
./ubuntu-16.04.1-服务器-amd64.iso
更新 4:更多结果:sudo find / -type f -name“*.iso”给了我想要的结果但是需要很长时间才能得到这些结果。
我想深入研究一下我是否确实有两个不同的数据库,因为根据我所在的驱动器,我会得到不同的定位结果。检查完 MAN 页面后,我在我的系统上搜索了 mlocate.db 文件,下面是我的结果:
- /usr/share/man/man5/mlocate.db.5.gz
- /var/lib/mlocate/mlocate.db
- /var/lib/mlocate/mlocate.db.VEzhqO
我认为 .VEzhqO 文件可能是辅助数据库,因此我尝试使用 -d 标志为locate 命令指定它。结果出现了“无法统计”错误。谜团仍在继续。
更新 5:我已经在另一台 Ubuntu 机器(16.04 服务器版本)上重现了这个问题。
更新 6:所以我有一个解决方案,找到“*.iso”,但现在我很好奇“为什么”它有效。我查看了 MAN 页面和以下两个链接:http://www.linfo.org/locate.html和http://www.howtogeek.com/112674/how-to-find-files-and-folders-in-linux-using-the-command-line/. 这些都不能解释为什么这样做有效。
答案1
在所有 shell 中,使用*.iso
在调用命令之前扩展为文件列表,因此在
locate *.iso
shell 会自动扩展表达式,从当前目录中的文件创建文件名列表。假设当前目录中有两个 iso 文件file1.iso
和file2.iso
;生成的命令实际上将是:
locate file1.iso file2.iso
然后 shell 就会执行它。因此,locate
将尝试查找包含这两个字符串的文件,实际上是搜索"*file1.iso*"
或"*file2.iso*"
。
这就是为什么在第一种情况下 find 比;实际搜索的locate iso
文件更多的原因。解决方案(也是正确的使用方法,恕我直言)是在命令接受使用 shell 的特殊字符的表达式时引用它们,例如以下命令:locate *.iso
locate
"*iso*"
find
find /etc/ -type f -iname "*.conf"
如果当前目录中有两个或多个 conf 文件,并且我们不使用引号,则 find 命令将无法解析生成的第二个文件名,并且我们的头发密度将在绝望和谷歌搜索中严重降低;D 因为错误消息似乎与没有引号无关。
答案2
因为某些原因,
locate *.iso
只在当前目录中搜索 .iso 文件,而
locate "*.iso"
搜索所有驱动器。不过,这是解决我的问题的方法。
答案3
Locate 会自动应用于*
字符串之前和之后,因此最简单的解决方案是:
locate .iso
我还安装了两个 Windows 驱动器。locate
从 Ubuntu 分区运行时,我得到的结果与您的问题类似。使用此答案可获得正确的结果:
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads/cfiles$ locate "*.iso" | wc -l
3
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads/cfiles$ locate *.iso | wc -l
3
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads/cfiles$ locate .iso | wc -l
45