как использовать регулярные выражения с командой find для фильтрации пути?

Опция -nd в вашей команде означает без каталогов.

Вы должны удалить параметр -nd из своей команды, и вы получите ту же структуру, что и на веб-сайте:

wget -r -l 10  -e robots=off http://biomet.ucdavis.edu/Evapotranspiration/

wget man

2.6 Параметры каталога

'- nd' '--no-directories'

Не создавать иерархию каталогов при рекурсивном извлечении. Если эта опция включена, все файлы будут сохраняться в текущем каталог, без затирания (если имя появляется более одного раза, имена файлов получат расширения ‘.n’).

0
08.08.2017, 03:43
2 ответа

Альтернативное решение с использованием findс -path:

$ find /level1 -type f -path "/level1/user??/dir02/*.oz" -print

Это напечатает пути всех обычных файлов, чей (полный) путь соответствует /level1/user? ?/dir02/*.oz.

Если вы знаете, что файлы находятся в каталоге dir02(а не в его подкаталоге), тогда они будут перечислены:

printf '%s\n' /level1/user??/dir02/*.oz
0
28.01.2020, 02:24

Если вы хотите указать несколько каталогов в первом аргументе, это зависит только от вашей оболочки. Итак, в bash и zsh и подобных (csh и tcsh? ), вы бы просто использовали шарообразную оболочку. Оболочка расширяет этот глобус на несколько интересующих вас каталогов и передает их в find, который может принимать несколько аргументов.

find /level1/*/dir02 -name "*.oz"

Несколько дополнительных пунктов:

  • Здесь используется синтаксис glob, а не регулярное выражение.
  • В любом случае ваше регулярное выражение было неправильным. (Не обращая внимания на цитирование ), должно было быть /level1/[a-z]*[0-9]*/dir02. Обратите внимание на *с.
  • Другим вариантом является -path, см. man find, но это более запутанно, чем просто использование глобусов оболочки.
3
28.01.2020, 02:24

Теги

Похожие вопросы