У меня есть каталог A
с большим количеством подкаталогов и файлов и хотите получить список всех файлов с именем foo
которые находятся внутри каталога в A
что соответствует *bar
. Например.:
./goldbar/fiz/baz/foo
./leadbar/foo
./candy/figbar/foo
У меня есть дополнительные ограничения:
*bar
(это необходимая оптимизация, так как сканирование займет много времени)find *bar -type f -name foo
терпит неудачу)Я думаю, что -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, и кажется, что он работает, надеюсь, поможет.