Вы могли бы стать удачливыми, если у Вас есть последовательное соединение в конце сервера. Подключите нуль-модемный кабель к ноутбуку и консоли в с Вашим любимым эмулятором терминала. Зависит, если Вы когда-либо настраивали, это в прошлом или каждом имело подключенные устройства TTY.
Мог бы работать 50/50
Чтобы сделать рекурсивные шарики в ударе, Вам нужно 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
find . -name '*.py'
** не делает чего-то большего чем сингла *, оба действуют в текущем каталоге
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--134075- Так как Bash 4 (также включая zsh) добавлена новая опция глоббинга ( globstar
), которая по-разному рассматривает образец * *
, когда он установлен.
Он соответствует образцу подстановочных знаков и возвращает имена файлов и каталогов, которые совпадают, путем замены образца подстановочных знаков в команде на соответствующие предметы.
Обычно при использовании * *
он работает аналогично *
, но рекурсивно (как цикл) рекурсивно обрабатывает все каталоги.
Чтобы убедиться, что он включен, проверьте его по shopt globstar
(в сценарии используйте shopt -q globstar
).
Пример * * .py
будет работать только для текущего каталога, так как он не возвращает список каталогов, которые могут быть рекурсивами, поэтому необходимо использовать несколько подстановочных знаков уровня каталога * */* .py
, чтобы он мог углубляться.
Пожалуйста, найдите в SO несколько синтаксических тестов, которые я сделал для рекурсивного поиска всех файлов.
nullglob
– glenn jackman 04.10.2012, 19:50nullglob
, Я настоятельно рекомендовал бы читать соблюдающие предупреждения. – Serge Stroobandt 20.06.2013, 00:53wc -l {**,.}/*.py
работает просто великолепно – Raphael 28.02.2018, 21:50