Как найти строку в списке файлов .gz?

Как упоминалось в комментариях, вы должны строить, используя что-то вроде make -j4 . Используйте число, равное количеству ядер ЦП или немного превышающее его.

make localmodconfig

Следующие инструкции применимы для сборки ядра из восходящего потока. Лично я считаю это самым простым. Я не знаю, как получить дерево с примененными патчами ubuntu, готовое к такой сборке.

(1) Теоретически, как вы собираете ядра в более разумные промежутки времени для тестирования, как предполагается,

cp /boot/config-`uname -r` .config

вам не нужно включать что-то новое, поэтому - единственная проблема в том, что {{1} } прерывается, если они переименовали материал:

make oldnoconfig

теперь отключают все модули, которые в данный момент не загружены. (Убедитесь, что у вас есть все ваши USB-устройства, которые вам нужны ...):

make localmodconfig

Это сработало у меня недавно, поэтому может быть полезно. Не так хорошо, как в прошлый раз, когда я это пробовал.

Я думаю, что я понял это примерно с одного часа до десяти минут. Даже после make localmodconfig он по-прежнему создает безумное количество ненужного мне материала. OTOH на самом деле обнаруживает и отключает эти вещи (например, в make xconfig ) тоже занимает некоторое время (и даже дольше, если вы по ошибке отключите то, что вам нужно ).

Думаю, стоит знать, что он существует, но это не гарантирует, что вы будете счастливы.

(2) Я не думаю, что сборка каждой модификации вашего «модуля» займет два часа. (На самом деле он должен быть встроенным, если вы реализуете новый системный вызов). make просто перекомпилирует ваши измененные файлы и интегрирует их в двоичный файл ядра.Так что, если правильно настроить Kconfig - слишком сложно, тогда, возможно, начальная двухчасовая сборка не так уж и плоха.

У вас может возникнуть эта проблема, если вы собираете дистрибутив с исходным кодом ядра. (Вы можете переключиться на ручную сборку или обмануть исходный пакет дистрибутива, используя ccache ). Или ваши изменения могут быть связаны с изменением файла заголовка, который, к сожалению, включен во многие многие исходные файлы.

Тем не менее, может быть полезно создать собственные Kconfigs, например Kconfigs гораздо меньшего размера, если вы хотите перенести на другие версии ядра, выполните git bisect , проверьте разные параметры сборки и т. д.

0
26.04.2019, 04:04
4 ответа

Вы можете использовать эту команду, чтобы узнать, появляется ли строка в некоторых файлах.gz в одной папке:

zgrep the_string  *.gz -l

Чтобы сделать это для списка папок, которые находятся в одной папке:

find. -name "*.gz" | xargs zgrep the_string -l

Например, вывод выглядит следующим образом:

./tmp/2/F.tar.gz
./tmp/2/F1.tar.gz
./tmp/1/F.tar.gz
./tmp/1/F1.tar.gz

Теперь вы получаете список файлов, содержащих эту строку.

0
28.01.2020, 02:40

Учитывая некоторый каталог верхнего уровня -, topdir, в котором расположены все ваши сжатые файлы, и при условии, что вы используете реализацию GNUzgrep:

zgrep -R -l -F --include='*.gz' -e 'string' topdir

Это приведет к поиску stringкак подстроки в любом изgzip-сжатых файлов в topdirи вернет пути ко всем совпадающим файлам.

Используя zgrepв системе без GNU zgrep, вы, скорее всего, не сможете использовать --include. Это может не быть проблемой, если ваш topdirсодержит только сжатые файлы, но если вы хотите искать только файл с суффиксом имени файла .gz, вы можете сделать

find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +

При этом будут найдены все обычные файлы с именами, заканчивающимися на .gz, в папке topdirи будет выполняться данная команда zgrepдля как можно большего количества файлов.

Если у вас даже нет zgrep, вы можете сделать

find topdir -type f -name '*.gz' -exec sh -c '
    for pathname do
        if gzip -dc "$pathname" | grep -q -F -e 'string'; then
            printf "%s\n" "$pathname"
        fi
    done' sh {} +

При этом каждый файл извлекается и проходит через обычный grep. Если найдена строка, содержащая заданную строку, печатается путь к файлу.

Обратите внимание, что «внутренний» сценарий оболочки представляет собой цикл, который можно легко изменить для работы со всеми*.gz-файлами в одном каталоге:

for pathname in./*.gz; do
    if gzip -dc "$pathname" | grep -q -F -e 'string'; then
        printf "%s\n" "$pathname"
    fi
done

Если вы хотите сопоставить stringкак полное слово, а не как подстроку, добавьте -wк вызовам grepвыше. Если stringнужно интерпретировать как регулярное выражение,удалить -F.

1
28.01.2020, 02:40

Если вы ищете повторяющиеся строки, которые не известны заранее, вот сценарий, который будет искать повторяющиеся слова в наборе файлов (слово здесь означает все, что имеет пробелы вокруг него):

#!/bin/bash

dup_words() {
    zcat $1 | tr ' ' '\n' | sed '/^$/d' | sort | uniq -c | awk '{if ($1 > 1) m=1; } END { exit(!m) } '
}

for i in *.gz
do
    dup_words $i && echo $i
done

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

Цикл просто выводит имя файла, и вы можете настроить действие после &&по своему усмотрению.

0
28.01.2020, 02:40

Вы можете использовать эту команду-

zgrep "foo" $(find. -name "*.gz")
0
10.09.2021, 06:38

Теги

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