correspondance regex avec "localiser"

8

J'essaie d'utiliser la commande Locate pour rechercher des fichiers dans mon dossier de départ, mais chaque fois que j'essaie de l'exécuter, je n'obtiens aucun résultat:

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

J'ai également essayé ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$mais cela ne donne aucun résultat non plus.

Le fichier que je recherche juste pour le tester est /home/jack/Music/Foals/My Number.flac

Je voudrais exclure les résultats des fichiers cachés de ma recherche.

Jack Jones
la source
2
Je ne connais pas locate. Est-il judicieux de combiner -b(c'est-à-dire " Ne faire correspondre que le nom de base avec les modèles spécifiés.") Avec un chemin d'accès --regexp? Pourquoi échappez-vous au /s?
Hauke ​​Laging du
Désolé d'utiliser un constructeur d'expressions régulières qui m'a conseillé d'échapper à ces personnages, et je suppose que vous avez raison sur le drapeau -b, je vais m'en débarrasser maintenant
Jack Jones
1
Que faut-il (My.)*faire? My.*$travaux. Vous devez vous échapper ()dans les RE de base.
Hauke ​​Laging du
1
Vous utilisez une expression régulière étendue. Mais --regexpprend un regex de base. Essayez de passer --regexpà --regex(non p). La page de manuel indique qu'il --regexfait une correspondance regex étendue.
Mikel

Réponses:

6

Cela semble faire l'affaire.

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

Citations du manuel:

-i, --ignore-case Ignore les distinctions de casse lors de la mise en correspondance de modèles.

-r, --regexp REGEXP Recherche une regexp REGEXP de base. Aucun MOTIF n'est autorisé si cette option est utilisée, mais cette option peut être spécifiée plusieurs fois.

Graeme
la source
Sous Linux, mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, à partir du 2018-02-05), la commande renvoie l'erreur suivante "Locate: les arguments sans option ne sont pas autorisés avec --regexp". mlocate est le package réel (/ usr / bin / Locate est un lien symbolique vers mlocate).
Hans Deragon
1

Fonctionnement de Locate

L'index des fichiers que la locatecommande utilise n'est reconstruit qu'une fois par jour, généralement. Il est construit par cette tâche cron, /etc/cron.daily/mlocate. Donc, vos entrées ne sont probablement pas encore là. Vous pouvez le réexécuter si vous souhaitez qu'il reconstruise manuellement ces index.

$ sudo /etc/cron.daily/mlocate

Utilisation de find

Cependant, il vaut probablement mieux utiliser une commande telle que findpour localiser des fichiers dans votre répertoire personnel.

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

Utilisation d'une interface graphique

Vous pourriez également être intéressé par un outil de recherche graphique. Jetez un œil à cet autre Q&A U&L intitulé: GTK Frontend pour localiser qui couvre un tel outil appelé Catfish. Cet outil peut utiliser à la fois des locatedonnées et des findcommandes.

slm
la source
1
Je trouve souvent locateplus rapide que findmême si je dois faire une updatedbpremière. Tant que la base de données est déjà raisonnablement à jour sur la plupart des systèmes, updatedbcela ne prendra pas longtemps. La syntaxe de recherche est probablement plus simple dans ce cas.
Graeme
Ouais, je l'ai utilisé tous les jours aussi, c'est uniquement sur des serveurs où je scénarise quelque chose vers lequel je vais souvent passer find.
slm
Oui, aurait dû mettre «la plupart des systèmes de bureau»
Graeme
1

Vous pouvez également adopter une approche différente:

locate "My file" | grep '/home/jack' | grep -v '/\.'

Je ne sais pas trop ce que vous essayez de faire. Vous utilisez le -idrapeau pour le rendre insensible à la casse et votre regex est pas très précis, vous semblez besoin top trouver tous les fichiers ou les dossiers qui sont sous /home/jacket qui contiennent MY, My, myou mYne importe où dans le nom du fichier. Si oui, lancez

locate -i my | grep '/home/jack' | grep -v '/\.'
terdon
la source
0

Cela devrait fonctionner - ne correspond qu'aux fichiers et dossiers non cachés:

find /home/jack -name "[^.]*My.*"

encore plus simple - cela correspond aux fichiers qui n'ont pas de répertoires cachés n'importe où dans l'arborescence des répertoires. C'est probablement ce que vous voulez:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done
jayhendren
la source
Je préférerais l'utiliser locate, car j'essaie de l'intégrer dans une interface graphique Python pour effectuer une recherche pendant que vous tapez et c'est plus rapide. Mais merci quand même!
Jack Jones
@JackJones vous n'avez même pas besoin located'accélérer les résultats. Par exemple:echo /home/jack/**/*My.*
jayhendren