我安裝了 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:也沒有什麼加密的。我一直在谷歌上搜尋並注意到這對某些用戶來說是一個問題。
更新3:我現在更困惑了。我正在嘗試查找我的計算機上的所有 .iso 文件,結果如下:
@:~$ 找到 FreeNAS
/mnt/data/Downloads/FreeNAS-9.3-RELEASE.iso
@:~$ 定位*.iso
/home/hudsona/ubuntu-16.04.1-server-amd64.iso
@:~$ 定位 iso
/home//ubuntu-16.04.1-server-amd64.iso
/mnt/data/Downloads/FreeNAS-9.3-RELEASE.iso
(以及一堆其他結果)
@:~$ 找到 . -類型 f -名稱“*.iso”
./ubuntu-16.04.1-伺服器-amd64.iso
更新4:更多結果:sudo find / -type f -name "*.iso"給了我想要的結果,但需要很長時間才能返回這些結果。
我想深入研究一下,看看我是否確實有兩個不同的資料庫,因為根據我所在的驅動器,我得到了不同的定位結果。這是我的結果:
- /usr/share/man/man5/mlocate.db.5.gz
- /var/lib/mlocate/mlocate.db
- /var/lib/mlocate/mlocate.db.VEzhqO
我認為 .VEzhqO 檔案可能是輔助資料庫,因此我嘗試使用定位命令的 -d 標誌來指定它。這給了我“無法統計”錯誤。謎團還在繼續。
更新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*"
。
這就是為什麼locate iso
查找的文件多於locate *.iso
;實際上是在第一種情況下locate
尋找。"*iso*"
解決方案(以及正確的使用方法,恕我直言)是在命令接受使用它們的表達式時引用 shell 的特殊字符,例如以下find
命令:
find /etc/ -type f -iname "*.conf"
如果當前目錄中有兩個或多個conf檔案並且我們不使用引號,則find命令將無法解析生成的第二個檔案名,並且我們的頭髮密度將在絕望和Google搜尋中嚴重減少;D因為錯誤訊息似乎與缺少引號無關。
答案2
因為某些原因,
locate *.iso
只搜尋目前目錄中的 .iso 文件,而
locate "*.iso"
搜尋您的所有磁碟機。但這是我的問題的解決方案。
答案3
定位會自動應用於*
字串之前和之後,因此最簡單的解決方案是:
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