我正在运行 Bionic Beaver,但在标准(它仍然称为 Unity 吗?)GUI 中找不到任何文件。如果我转到某个文件夹,它似乎能够随后找到这些文件,但对于我不知道其位置的文件,这毫无用处。这些实际上是使用 META 从 Dock 搜索和使用 Ctrl+F 从文件浏览器搜索的独立问题(它仍然称为 Nautilus 吗?)
我相信这个问题有早期版本,但我还没有找到任何似乎适用于我的设置的内容。
答案1
文件已为命令建立索引locate
,但通常每天都会更新,因此您今天创建的任何新文件直到明天才会显示。我通过将其设置sudo updatedb
为每 15 分钟运行一次的 cron 作业(只需几秒钟即可运行)来解决这个问题。
该locate
命令的行为就像使用通配符一样:
$ time locate etc/profile
/etc/profile
/etc/profile.d
/etc/profile.d/appmenu-qt5.sh
/etc/profile.d/apps-bin-path.sh
/etc/profile.d/bash_completion.sh
/etc/profile.d/cedilla-portuguese.sh
/etc/profile.d/jdk.csh
/etc/profile.d/jdk.sh
/etc/profile.d/vte-2.91.sh
real 0m0.696s
user 0m0.671s
sys 0m0.024s
我locate
在命令前面加上了命令前缀time
,这样您就可以看到它使用隐含通配符对索引文件名和目录名进行查找的速度有多么快。
输出locate
相当稀疏,因此我创建了一个别名llocate
来很好地格式化输出(如何使定位输出看起来像“ll”或“ls -la”但更漂亮?):
$ time llocate etc/profile
ACCESS OWNER GROUP SIZE MODIFIED NAME (updatdb last ran: 2018-07-01 11:30:05)
-rw-r--r-- root root 575 Nov 12 2017 /etc/profile
drwxr-xr-x root root 4096 Jun 4 17:19 /etc/profile.d
-rw-r--r-- root root 40 Feb 16 2017 /etc/profile.d/appmenu-qt5.sh
-rw-r--r-- root root 580 Oct 18 2017 /etc/profile.d/apps-bin-path.sh
-rw-r--r-- root root 663 May 18 2016 /etc/profile.d/bash_completion.sh
-rw-r--r-- root root 1003 Dec 29 2015 /etc/profile.d/cedilla-portuguese.sh
-rwxr-xr-x root root 301 Feb 20 2013 /etc/profile.d/jdk.csh
-rwxr-xr-x root root 299 Feb 20 2013 /etc/profile.d/jdk.sh
-rw-r--r-- root root 1941 Mar 16 2016 /etc/profile.d/vte-2.91.sh
real 0m0.760s
user 0m0.754s
sys 0m0.020s
注意标题如何告诉您上次索引文件的时间。如果您找不到要查找的文件,并且该文件是在该时间之前创建的,只需运行sudo updatedb
。
time
再次使用该命令,因此您可以看到,使用速度比返回大量结果时llocate
略慢。locate
locate
GUI 前端glocate
虽然locate
是 CLI 命令,但我使用 为它创建了一个 GUI 前端zenity
。这是一个初始的“简单”前端,可以使用 进行改进yad
。
输入最多10个搜索文件名/目录名
启动时出现此屏幕glocate
:
您可以输入全部或部分目录名和文件名。
滚动框中返回结果
glocate
大多数情况下大约需要一秒钟才能显示结果:
Bash 脚本
以下是您可以使用以下工具创建的 bash 脚本:
sudo -H gedit /usr/local/bin/glocate
然后复制并粘贴以下行:
#!/bin/bash
# NAME: glocate
# PATH: /usr/local/bin
# DESC: Provide zenity GUI front end to locate command
# DATE: Dec 24, 2018.
# NOTE: Written for: https://askubuntu.com/questions/1104069/search-is-useless-how-can-i-force-it-to-index-my-hard-drive-2018/1104112#1104112
Init () {
# Get date `sudo updatedb` was last run
LastRun=$(stat --printf=%y /var/lib/mlocate/mlocate.db | sed 's/\.[^\n]*//')
SearchMax=10 # Search for up to 10 filenames or directories at once
}
GetSearchNames () {
SearchNames=$(zenity \
--title "glocate - updatedb last run: $LastRun" \
--text '<span foreground="blue" font="14">Enter up to 10 search names</span>' \
--forms --width=800 --height=480 \
--add-entry="Search 1" --add-entry="Search 2" --add-entry="Search 3" \
--add-entry="Search 4" --add-entry="Search 5" --add-entry="Search 6" \
--add-entry="Search 7" --add-entry="Search 8" --add-entry="Search 9" \
--add-entry="Search 10" 2>/dev/null)
Action="$?" # Glitch: When ESC pressed or Cancel clicked result is 0?
# echo "Action: $Action" # Remove leading # to debug
# Zenity not returning array like yad would. Build array manually
SearchArr=() # Reset array
for (( i=1; i<=$SearchMax; ++i)) ; do
Field="$(echo "$SearchNames"| cut -d '|' -f $i)"
[[ $Field != "" ]] && SearchArr+=("$Field")
done
# Click OK without search names?
CharacterCount=$(wc -c <<< "${SearchNames[@]}")
# echo "CharacterCount: $CharacterCount" # Remove leading # to debug
# if [[ "$Action" == 0 && "$CharacterCount" == "$SearchMax" ]] ; then
if [[ "$CharacterCount" -le "$SearchMax" ]] ; then
zenity --error --title="glocate" \
--text="No search names entered. Program will end." \
2>/dev/null
Action=99
fi
return "$Action" # 0 = Proceed with search, anything else = quit.
}
DisplaySearch () {
Result=$(locate "${SearchArr[@]}" )
zenity \
--title "locate search results" \
--text '<span foreground="blue" font="14">Scroll to see more results</span>' \
--list --separator="$IFS" --width=800 --height=480 \
--hide-header --column "Directory and filenames" \
"${Result[@]}" 2>/dev/null
}
Main () {
Init
while GetSearchNames ; do DisplaySearch ; done
}
Main
保存文件并退出gedit
。
使用以下方法将脚本标记为可执行:
sudo chmod a+x /usr/local/bin/glocate
如果您想创建桌面快捷方式,请参见:创建桌面快捷方式的简单方法?
要从终端调用脚本,只需使用:glocate
。
答案2
GUI 工具
在图形桌面环境中,您可以尝试雷科尔,这是一个强大的工具,可以搜索文件名以及文件内容。
安装后,请参阅
man recoll
或通过互联网查找教程以了解更多信息。通常,该
recoll
命令将启动用于查询 Recoll 数据库的图形用户界面。在第一次运行时,recoll 将创建可以在开始第一次索引之前进行自定义的用户配置。
glocate
是由 @WinEunuuchs2Unix 制作的全新 GUIlocate
,并在此处的另一个答案中进行了描述。它非常基础,而且便于使用。
命令行工具
在文本屏幕或终端窗口中,您可以使用带有find
和 的命令行grep
。
find
是一款非常强大的文件查找工具。示例:find / -iname "*autostart*" # to search everywhere find ~ -iname "*autostart*" # to search in your home directory
sudo find ...
如果存在您无法以普通用户身份搜索的目录,请使用提升的权限。请参阅man find
或通过互联网查看教程以了解更多信息。grep
是一款非常强大的工具,用于在文件中查找文本字符串(搜索文件内容)。示例grep 'alias' ~/.bashrc
或通过互联网查看
man grep
教程来了解更多信息。locate
是一款具有更新数据库的快速查找文件的工具。请参阅man locate
或通过互联网查看教程以了解更多信息。locate
更新数据库sudo updatedb
如果它不包含安装在 中的辅助文件系统,
/media
您可以编辑配置文件以使其包含它(或将挂载点移动到/mnt
,但这可能会导致硬编码路径出现问题),cd /etc sudo cp -p updatedb.conf updatedb.conf.bak sudo nano updatedb.conf