16.04 インストールをセットアップして、ダウンロード フォルダをセカンダリ ハード ドライブ ( と表示Downloads -> /mnt/data/Downloads
) に設定しています。locate
ファイルを検索するために を実行しても、このドライブにファイルが表示されません。 を実行しsudo updatedb
、 を確認しました(探しているディレクトリやファイルupdatedb.conf
以外は何も表示されません)/mnt
私にとって興味深いのは、私がcd /mnt/data/Downloads
走った時に見つけるこのディレクトリ内のすべては表示されますが、プライマリ ドライブ内のすべては表示されません。Ubuntu には、どのドライブを使用しているかに応じて 2 つの異なる検索データベースがあるようです。
この状況を改善するにはどうすればいいでしょうか?
追加: これが私の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/ダウンロード/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/ダウンロード/FreeNAS-9.3-RELEASE.iso
(その他多数の結果)
@:~$ find . -type f -name "*.iso"
./ubuntu-16.04.1-server-amd64.iso
アップデート4:より多くの結果:sudo find / -type f -name "*.iso"希望する結果は得られますが、その結果が返ってくるまでに長い時間がかかります。
どのドライブにいるかによって異なる検索結果が表示されるので、実際に 2 つの異なるデータベースがあるかどうか詳しく調べたいと思いました。MAN ページを確認した後、システムで mlocate.db ファイルを検索しました。結果は次のとおりです。
- ディレクトリ: /usr/share/man/man5/mlocate.db.5.gz
- /var/lib/mlocate/mlocate.db
- /var/lib/mlocate/mlocate.db.VEzhqO
.VEzhqO ファイルがセカンダリ データベースである可能性があると考え、locate コマンドの -d フラグでそれを指定してみました。すると、「can not stat」というエラーが発生しました。謎は続きます。
アップデート5:これを別の Ubuntu マシン、16.04 サーバー エディションで再現しました。
アップデート6:そこで、解決策として「*.iso」を見つけますが、それが「なぜ」機能するのかが気になります。MAN ページと次の 2 つのリンクを確認しました。http://www.linfo.org/locate.htmlそしてhttp://www.howtogeek.com/112674/linux でコマンドラインを使用してファイルとフォルダーを検索する方法/これらはどれも、それがなぜ機能するのかについて何も明らかにしていません。
答え1
すべてのシェルでは、*.iso
コマンドを呼び出す前にファイルのリストを展開します。
locate *.iso
シェルは、現在のディレクトリ内のファイルからファイル名リストを作成する式を自動的に展開します。現在のディレクトリに 2 つの iso ファイルと があると仮定するとfile1.iso
、file2.iso
結果として得られるコマンドは実際には次のようになります。
locate file1.iso file2.iso
シェルはそれを実行します。したがって、はlocate
これら 2 つの文字列を含むファイルを検索し、実質的には"*file1.iso*"
または を検索します"*file2.iso*"
。
そのため、最初のケースでは、 ; が実際に検索するlocate iso
ファイル数よりも多くのファイルを検索します。解決策 (そして、私見では正しい使用方法) は、次のコマンドのように、コマンドがシェルの特殊文字を使用した式を受け入れるときに、特殊文字を引用符で囲むことです。locate *.iso
locate
"*iso*"
find
find /etc/ -type f -iname "*.conf"
現在のディレクトリに 2 つ以上の conf ファイルがあり、引用符を使用していない場合は、生成された 2 番目のファイル名の解析で find コマンドが失敗し、絶望して Google 検索するうちに髪の毛の密度が大幅に低下します ;D エラー メッセージは引用符の欠如とは関係がないようです。
答え2
何らかの理由で、
locate *.iso
現在のディレクトリでのみ.isoファイルを検索し、
locate "*.iso"
すべてのドライブを検索します。ただし、これが私の問題の解決策です。
答え3
*
Locate は文字列の前後に自動的に適用されるため、最も簡単な解決策は次のとおりです。
locate .iso
私も 2 つの Windows ドライブをマウントしています。Ubuntulocate
パーティションから実行すると、質問と同様の結果が得られます。この回答を使用すると、正しい結果が得られます。
───────────────────────────────────────────────────────────────────────────────────────────
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