Назад | Перейти на главную страницу

Как ограничить поиск Linux по префиксу?

У меня есть каталог A с большим количеством подкаталогов и файлов и хотите получить список всех файлов с именем foo которые находятся внутри каталога в A что соответствует *bar. Например.:

У меня есть дополнительные ограничения:


Я думаю, что -path флаг даст мне нужные мне результаты, но я не знаю, соответствует ли он первому из вышеуказанных ограничений.


Изменить: Предположим, что в каталоге n * 10k A тот матч *bar. то есть все, что пытается создать команду со всеми из них (в отличие от обработки каждого из них), потерпит неудачу.

Если вы ищете решение исключительно с find, затем

find . \( -depth 1 -type d \! -name "*bar" \) -prune -o \( -depth +1 \! -type d -name foo \) -print

должен сделать свое дело.

Я не уверен как -path будет обрабатывать "не спускаться в каталоги, которые не совпадают *bar"требование, и я слишком ленив, чтобы создать среду, чтобы узнать.
Я знаю, что следующее будет работать практически на любой платформе * nix:

for dir in `ls -1 | grep bar`; do
   find $dir -type f -name foo
done

Дополнительная ласка ls/grep bit может потребоваться, если у вас есть простые файлы, сокеты и т. д. в вашем каталоге верхнего уровня, или если вы хотите немного изменить свои условия.

Попробуйте это - хотя не уверен, насколько быстро это будет.

find -maxdepth 1 -type d -name '*bar' -exec find {} -name foo \;

ПРИМЕЧАНИЕ это не работает для Solaris 10, поскольку в его находке нет -maxdepth

Как насчет версии регулярного выражения:

find -regex './[^/]*bar/.*/?foo$'

РЕДАКТИРОВАТЬ: настроил его более чистым и завершил строку (чтобы вы не соответствовали fooble, foogasm и т. Д.)

Я проверил с помощью strace, и -path сам по себе не позволяет избежать ненужного вторжения в несовпадающие каталоги. Однако это должно сработать:

find . \( -name '.' \) -print -o \( ! -path '*directory_pattern*' \) -prune -o -name '*file_pattern*' -print

В \( и \)s на самом деле не нужны в этом конкретном случае, но они добавляют удобочитаемость и, вероятно, понадобятся, если вы используете более сложные выражения. Проверено с помощью strace, и кажется, что он работает, надеюсь, поможет.