Рекурсивный шарик?

Вы могли бы стать удачливыми, если у Вас есть последовательное соединение в конце сервера. Подключите нуль-модемный кабель к ноутбуку и консоли в с Вашим любимым эмулятором терминала. Зависит, если Вы когда-либо настраивали, это в прошлом или каждом имело подключенные устройства TTY.

Мог бы работать 50/50

87
21.08.2017, 18:51
3 ответа

Чтобы сделать рекурсивные шарики в ударе, Вам нужно globstar функция от версии 4 удара или выше.

Из страницы справочника удара:

globstar
    If set, the pattern ** used in a pathname expansion context will
    match all files and zero or more directories and subdirectories.
    If the pattern is followed by a /, only directories and
    subdirectories match.

Для Вашего шаблона в качестве примера:

shopt -s globstar
ls **/*.py
111
27.01.2020, 19:30
  • 1
    я рекомендовал бы также включить nullglob –  glenn jackman 04.10.2012, 19:50
  • 2
    @glennjackman ответа, Но перед включением nullglob, Я настоятельно рекомендовал бы читать соблюдающие предупреждения. –  Serge Stroobandt 20.06.2013, 00:53
  • 3
  • 4
    С ударом 3.2, wc -l {**,.}/*.py работает просто великолепно –  Raphael 28.02.2018, 21:50
  • 5
    @Raphael я проверил дважды информацию о версии и это определенно, говорит, что это было представлено в 4,0. Возможно, Вы распределение бэкпортировали патч для него? IIRC RHEL 5 бэкпортировал некоторые функции. Также знаменитый, это были 9 лет, с тех пор как удар 4 был выпущен... –  jordanm 28.02.2018, 22:21
find . -name '*.py'

** не делает чего-то большего чем сингла *, оба действуют в текущем каталоге

12
27.01.2020, 19:30
  • 1
    Интересный. Хотя, я более фокусируюсь на синтаксисе шарика отдельно, потому что я должен использовать его в конфигурационном файле (включайте директиву). Мне не нужен список файлов. –  Paolo 04.10.2012, 18:48
  • 2
    @Doug, это больше не верно. удар теперь скопировал это zsh функция (хотя это приняло синтаксис ближе к синтаксису ksh93 и как ksh, еще не поддерживает globbing спецификаторы zsh, который ограничивает его полноценность) –  Stéphane Chazelas 04.10.2012, 23:34
  • 3
    Существует много вещей, с которыми можно сделать find если у Вас нет удара 4. Примеры: yourcommand `find . -name '*.py'` (отметьте обратные галочки); find . -name '*.py' -exec yourcommand {} \;. –  Mars 28.10.2015, 20:43

Для этого есть два простых решения. В основном используется xargs или parallel .

xargs Approach:

Можно использовать xargs с найти следующим образом:

find . -type f -print0  | xargs -0 -P number_of_processes grep mypattern > output

Где вы замените число _ _ процессов на максимальное количество процессов, которые вы хотите запустить. Однако это не гарантирует значительную производительность в случае ограничения производительности ввода-вывода. В этом случае можно попытаться запустить больше процессов, чтобы компенсировать потерянное время ожидания ввода-вывода.

Кроме того, с помощью поиска можно указать более расширенные опции вместо просто узоров файлов, таких как время модификации и т.д.

Одна возможная проблема с таким подходом, как объясняется комментариями Стефана, если файлов мало, xargs может не запустить достаточно много процессов для них. Одним из решений будет использование параметра -n для xargs для указания количества аргументов, которые должны быть взяты из канала одновременно. Установка параметра -n1 заставит xargs начать новый процесс для каждого отдельного файла. Это может быть желательным поведением, если файлы очень большие (как в случае этого вопроса) и имеется относительно небольшое количество файлов. Однако, если сами файлы малы, накладные расходы на запуск нового процесса могут подорвать преимущество параллелизма, и в этом случае большее значение -n будет лучше. Таким образом, параметр -n может быть точно настроен в соответствии с размерами и количеством файлов.

Параллельный подход:

Другим способом является использование инструмента Ole Tange GNU Parallel parallel (см. здесь ). Это обеспечивает более высокий уровень управления параллелизмом и даже может быть распределено по нескольким узлам (было бы полезно, если бы каталог был общим, например). Простейший синтаксис с использованием параллели будет:

найти. -type f | parallel -j + 1 grep mypattern

, где опция -j + 1 предписывает параллельному запуску одного процесса сверх количества ядер на компьютере (это может быть полезно для ограниченных задач ввода-вывода, вы можете даже попытаться увеличить число).

Parallel также имеет преимущество перед xargs в том, что фактически сохраняет порядок вывода из каждого процесса и генерирует непрерывный вывод. Например, при использовании xargs , если процесс 1 генерирует строку, скажем p1L1 , процесс 2 генерирует строку p2L1 , процесс 1 генерирует другую строку p1L2 , выход будет:

p1L1
p2L1
p1L2

, тогда как при parallel выход должен быть:

p1L1
p1L2
p2L1

Это обычно полезнее, чем xargs выход.

-121--11689-

Проверка этой ссылки была бы полезна:

http://tweaktheserver.com/ssh-cant-connect-authentications-that-can-continue-publickeygssapi-keyexgssapi-with-micpassword/

-121--134075-

Так как Bash 4 (также включая zsh) добавлена новая опция глоббинга ( globstar ), которая по-разному рассматривает образец * * , когда он установлен.

Он соответствует образцу подстановочных знаков и возвращает имена файлов и каталогов, которые совпадают, путем замены образца подстановочных знаков в команде на соответствующие предметы.

Обычно при использовании * * он работает аналогично * , но рекурсивно (как цикл) рекурсивно обрабатывает все каталоги.

Чтобы убедиться, что он включен, проверьте его по shopt globstar (в сценарии используйте shopt -q globstar ).

Пример * * .py будет работать только для текущего каталога, так как он не возвращает список каталогов, которые могут быть рекурсивами, поэтому необходимо использовать несколько подстановочных знаков уровня каталога * */* .py , чтобы он мог углубляться.

Пожалуйста, найдите в SO несколько синтаксических тестов, которые я сделал для рекурсивного поиска всех файлов.

8
27.01.2020, 19:30

Теги

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