регулярное выражение, совпадающее с «locate»


8

Я пытаюсь использовать команду locate для поиска файлов в моей домашней папке, однако всякий раз, когда я пытаюсь выполнить это, я не получаю результатов:

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

Я также пытался, ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$но это также не дает результатов.

Файл, который я ищу, просто чтобы проверить это /home/jack/Music/Foals/My Number.flac

Я хотел бы исключить результаты поиска скрытых файлов из моего поиска.


2
Я не знаком с locate. Имеет ли смысл объединять -b(т. Е. «Сопоставлять только базовое имя с указанными шаблонами») с путем в --regexp? Почему вы избегаете /с?
Хауке Лагинг

Извините, я использовал конструктор регулярных выражений, который посоветовал мне убежать от этих персонажей, и я думаю, вы правы насчет флага -b, сейчас я от него избавлюсь
Джек Джонс

1
Что (My.)*должен делать? My.*$работает. Вы должны сбежать ()в основных РЗ.
Хауке Лагинг

1
Вы используете расширенное регулярное выражение. Но --regexpпринимает основное регулярное выражение. Попробуйте перейти --regexpна --regex(нет p). На странице руководства сказано, --regexчто расширенное сопоставление регулярных выражений.
Микель

Ответы:


6

Это похоже на работу.

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

Цитаты из руководства:

-i, --ignore-case Игнорировать различия регистра при сопоставлении шаблонов.

-r, --regexp REGEXP Поиск базового регулярного выражения REGEXP. PATTERN не допускаются, если используется эта опция, но эта опция может быть указана несколько раз.


В Linux mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, по состоянию на 2018-02-05) команда возвращает следующую ошибку «locate: неопционные аргументы недопустимы с --regexp». mlocate - это фактический пакет (/ usr / bin / locate - символическая ссылка на mlocate).
Ханс Дерагон

1

Как найти работает

Индекс файлов, locateиспользуемых командой, обычно перестраивается один раз в день. Это построено этой работой cron /etc/cron.daily/mlocate. Так что ваши записи скорее всего просто еще не там. Вы можете перезапустить его, если хотите вручную перестроить эти индексы.

$ sudo /etc/cron.daily/mlocate

Используя find

Однако вам, вероятно, лучше использовать такую ​​команду, как findпоиск файлов в вашем домашнем каталоге.

$ 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

Использование графического интерфейса

Вас также может заинтересовать графический инструмент поиска. Взгляните на другие вопросы и ответы по U & L под названием: GTK Frontend для locate, который охватывает один из таких инструментов, как Catfish. Этот инструмент может использовать как locateданные, так и findкоманды.


1
Я часто нахожу locateбыстрее, чем findдаже если я должен сделать updatedbпервый. Пока база данных уже достаточно свежая, на большинстве систем updatedbэто не займет много времени. Найти синтаксис, вероятно, проще в этом случае, хотя.
Грэм

Да, я тоже использовал его ежедневно, только на серверах, где я пишу что-то, на что я часто переключаюсь find.
SLM

Да, следовало бы поставить «большинство настольных систем»
Грэм

1

Вы также можете использовать другой подход:

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

Я не уверен, что ты пытаешься сделать. Вы используете -iфлаг , чтобы сделать его чувствительно к регистру и ваше регулярное выражение не очень специфично, вы , кажется , топ хотите найти все файлы и папки , которые находятся под /home/jackи которые содержат MY, My, myили mYгде - нибудь в имени файла. Если так, просто беги

locate -i my | grep '/home/jack' | grep -v '/\.'

0

Это должно работать - сопоставляет только не скрытые файлы и папки:

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

еще проще - это соответствует файлам, которые не имеют скрытых каталогов где-либо в дереве каталогов. Вероятно, это то, что вы хотите:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done

Я бы предпочел использовать locate, так как я пытаюсь интегрировать его в графический интерфейс Python для поиска по мере ввода, и это быстрее. Но все равно спасибо!
Джек Джонс

@JackJones, вам даже не нужно locateускорять результаты. Например:echo /home/jack/**/*My.*
Jayhendren
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.