web-dev-qa-db-fra.com

La recherche est inutile. Comment puis-je le forcer à indexer mon disque dur (2018)

J'utilise Bionic Beaver et je ne trouve aucun de mes fichiers dans l'interface graphique standard (est-il toujours appelé Unity?). Si je vais dans un dossier, il semble pouvoir retrouver ces fichiers par la suite, mais cela ne sert à rien pour les fichiers dont je ne connais pas déjà l'emplacement. Ce sont en fait des problèmes distincts pour effectuer une recherche à partir du dock à l'aide de META et à l'aide de Ctrl + F à partir du navigateur de fichiers (est-ce toujours appelé Nautilus?)

Je pense qu'il existe des versions antérieures de cette question, mais je n'ai encore rien trouvé qui semble s'appliquer à ma configuration.

2
jdc

Les fichiers sont indexés pour la commande locate, mais elle est normalement mise à jour tous les jours. Ainsi, tout nouveau fichier créé aujourd'hui n'apparaîtra que demain. J'ai contourné ce manque en plaçant Sudo updatedb comme un travail cron qui s'exécute toutes les 15 minutes (son exécution ne prend que quelques secondes).

La commande locate se comporte comme si des caractères génériques étaient utilisés:

$ 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

J'ai préfixé la commande locate par la commande time afin que vous puissiez voir à quel point il effectue des recherches éblouissantes sur les noms de fichiers indexés et les noms de répertoires avec des caractères génériques implicites.


La sortie locate est plutôt clairsemée. J'ai donc créé un alias llocate pour formater correctement la sortie ( . `mais plus agréable? ):

$ 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

Remarquez comment l'en-tête vous indique la dernière fois que les fichiers ont été indexés. Si vous ne trouvez pas le fichier que vous recherchez et s'il a été créé avant cette heure, exécutez simplement Sudo updatedb.

La commande time est à nouveau utilisée. Vous pouvez donc constater que l'utilisation de llocate est légèrement plus lente que locate sauf si un nombre considérable de résultats est renvoyé.


locate Interface graphique glocate

Bien que locate soit une commande CLI, j'ai créé une interface graphique à l'aide de zenity. Il s'agit d'une interface initiale "sans fioritures" qui pourrait être améliorée en utilisant yad à la place.

Entrez jusqu'à 10 noms de fichier de recherche/noms de répertoire

Cet écran apparaît au démarrage de glocate:

glocate 1.png

Vous pouvez entrer des noms de répertoire et des noms de fichiers en tout ou en partie.

Résultats retournés dans la boîte de défilement

glocate prend environ une seconde pour afficher les résultats dans la plupart des cas:

glocate 2.png

Script Bash

Voici le script bash que vous pouvez créer en utilisant:

Sudo -H gedit /usr/local/bin/glocate

Puis copiez et collez la ligne suivante:

#!/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

Enregistrez le fichier et quittez gedit.

Marquez le script comme exécutable en utilisant:

Sudo chmod a+x /usr/local/bin/glocate

Si vous souhaitez créer un raccourci sur le bureau, voir: Un moyen simple de créer un raccourci sur le bureau?

Pour appeler le script depuis le terminal, utilisez simplement: glocate.

3
WinEunuuchs2Unix

Outils d'interface graphique

  • Dans un environnement de bureau graphique, vous pouvez essayer Recoll , un outil puissant qui permet de rechercher des noms de fichier ainsi que leur contenu.

    Une fois installé, consultez man recoll ou un didacticiel via Internet pour en savoir plus.

    • En règle générale, la commande recoll lance l'interface graphique permettant d'interroger la base de données Recoll.

    • Lors de la première exécution, récoll créera la configuration utilisateur qui peut être personnalisée avant de commencer la première indexation.

    • Lien: Recoll est un outil de recherche de texte intégral de burea

  • glocate est une toute nouvelle interface graphique pour locate réalisée par @ WinEunuuchs2Unix et décrite dans une autre réponse ici. Il est très basique et facile à utiliser .

Outils de ligne de commande

Dans un écran de texte ou une fenêtre de terminal, vous pouvez utiliser les lignes de commande avec find et grep.

  • find est un outil très puissant pour trouver des fichiers. Exemples:

    find / -iname "*autostart*"  # to search everywhere
    
    find ~ -iname "*autostart*"  # to search in your home directory
    

    Utilisez des autorisations élevées, Sudo find ... s'il existe des répertoires, que vous n'êtes pas autorisé à rechercher en tant qu'utilisateur standard. Voir man find ou un tutoriel via Internet pour en savoir plus.

  • grep est un outil très puissant pour rechercher des chaînes de texte dans les fichiers (recherche du contenu du fichier). Exemples

    grep 'alias' ~/.bashrc
    

    Voir man grep ou un tutoriel via Internet pour en savoir plus.

  • locate est un outil rapide pour rechercher des fichiers lorsqu'il dispose d'une base de données mise à jour. Voir man locate ou un tutoriel via Internet pour en savoir plus.

    • Mettez à jour la base de données pour locate avec

      Sudo updatedb
      

      et s'il n'inclut pas de système de fichiers secondaire monté dans /media, vous pouvez modifier le fichier de configuration pour l'inclure (ou déplacer le point de montage vers /mnt, mais cela peut entraîner des problèmes chemins codés en dur),

      cd /etc
      Sudo cp -p updatedb.conf updatedb.conf.bak
      Sudo nano updatedb.conf
      
2
sudodus