locateGUI 前端glocate

locateGUI 前端glocate

我正在运行 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


locateGUI 前端glocate

虽然locate是 CLI 命令,但我使用 为它创建了一个 GUI 前端zenity。这是一个初始的“简单”前端,可以使用 进行改进yad

输入最多10个搜索文件名/目录名

启动时出现此屏幕glocate

球形 1.png

您可以输入全部或部分目录名和文件名。

滚动框中返回结果

glocate大多数情况下大约需要一秒钟才能显示结果:

Glocate 2.png

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 将创建可以在开始第一次索引之前进行自定义的用户配置。

    • 关联:Recoll 是一款桌面全文搜索工具

  • glocate是由 @WinEunuuchs2Unix 制作的全新 GUI locate,并在此处的另一个答案中进行了描述。它非常基础,而且便于使用

命令行工具

在文本屏幕或终端窗口中,您可以使用带有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
      

相关内容