Найти, распаковать и скопировать содержимое нескольких файлов за один шаг / команду - PullRequest
0 голосов
/ 24 июня 2019

Сначала я задал вопрос: Распакуйте файл, а затем отобразите его в консоли за один шаг Это работает и мне очень помогло. (пожалуйста, прочитайте)

Теперь у меня есть вторая проблема. У меня нет ни одного zipped log file, но у меня их много в разных папках, которые мне нужно найти в первую очередь. Файлы имеют одинаковые имена. Например:

/somedir/server1/log.gz
/somedir/server2/log.gz
/somedir/server3/log.gz

и так далее ...

Мне нужен способ:

  1. найти все файлы, например: find /somedir/server* -type f -name log.gz
  2. распакуйте файлы, например: gunzip -c log.gz
  3. использовать grep для содержимого файлов

Внимание! Все должно быть сделано за один шаг. Я не могу сначала сохранить извлеченные файлы в файловой системе, потому что это файловая система только для чтения. Мне нужно как-то соединить, с помощью каналов, вывод одной команды со входом следующей.

Раньше файлы журналов были в текстовом формате (.txt), поэтому мне не пришлось сначала их разархивировать. В этом случае это было легко: ех. find /somedir/server* -type f -name log.txt | xargs grep "term"

Теперь мне нужно разобраться с заархивированными файлами. Это означает, что после того, как я найду файлы, мне нужно сначала как-то распаковать их, а затем отправить содержимое на grep. С одним файлом я делаю: gunzip -p /somedir/server1/log.gz | grep term Но для нескольких файлов я не знаю, как это сделать. Например, как передать выходные данные find в gunzip и в grep?!

Также, если есть другой способ / «наилучшая практика», как это сделать, можно только приветствовать:)

1 Ответ

1 голос
/ 24 июня 2019

find позволяет вызвать команду для файлов, которые она найдет:

find /somedir/server* -type f -name log.gz -exec gunzip -c '{}' + | grep ...

со страницы руководства :

-exec command {} +

Этот вариант действия -exec запускает указанную команду выбранные файлы, но командная строка строится путем добавления каждое выбранное имя файла в конце; общее количество количество вызовов команды будет намного меньше числа совпавших файлов. Командная строка строится во многом так же способ, которым xargs строит свои командные строки. Только один экземпляр {} разрешено в команде, и (когда поиск вызывается из оболочки) он должен быть заключен в кавычки (например, '{}') защитить его от интерпретации снарядами. Команда выполняется в начальном каталоге. Если любой вызов с форма + возвращает ненулевое значение в качестве состояния выхода, затем find возвращает ненулевой статус выхода. Если найти встречает ошибка, это может иногда вызывать немедленный выход, поэтому некоторые ожидающие команды могут вообще не выполняться. Этот вариант -exec всегда возвращает истину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...