Мне удалось застрелиться там, где это больно (очень плохо), переформатировав раздел, содержащий ценные данные. Конечно, это не было преднамеренным, но это случилось.
Однако мне удалось использовать testdisk
и photorec
восстановить большую часть данных. Теперь у меня есть все эти данные, распределенные по почти 25 000 каталогов. Большинство файлов - это файлы .txt, а остальные - файлы изображений. В каждом каталоге более 300 .txt файлов.
Я могу grep
или использую, find
чтобы извлечь определенные строки из файлов .txt и вывести их в файл. Например, вот строка, которую я использовал, чтобы проверить, что мои данные находятся в восстановленных файлах:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Я могу вывести "searchPattern" в файл, но это просто дает мне этот шаблон. Вот что я действительно хотел бы достичь:
Просмотрите все файлы и найдите определенную строку. Если эта строка найдена в файле, поместите ВСЕ содержимое этого файла в выходной файл. Если шаблон найден в нескольких файлах, добавьте содержимое последующих файлов в этот выходной файл. Обратите внимание, что я просто не хочу выводить шаблон, который я ищу, но ВСЕ содержимое файла, в котором находятся шаблоны.
Я думаю, что это выполнимо, но я просто не знаю, как получить все содержимое файла после извлечения из него определенного шаблона.
источник
Ответы:
Если я правильно понимаю вашу цель, следующее будет делать то, что вы хотите:
Это будет искать все
*.txt
файлы в./recup*/
, проверить каждый из нихsearchPattern
, если он совпадает с этим будетcat
файл. Вывод всехcat
файлов ed будет направлен вoutputfile.txt
.Повторите для каждого шаблона и выходного файла.
Если у вас очень большое количество совпадающих каталогов
./recup*
, вы можете получитьargument list too long error
. Простой способ обойти это сделать что-то вроде этого:Это будет соответствовать полному пути. Так
./recup01234/foo/bar.txt
будет соответствовать. Это-mindepth 2
так, чтобы оно не совпадало./recup.txt
, или./recup0.txt
.источник
grep -l
), а затем|sort|uniq
иcat
из списка файлов.Вместо того, чтобы выводить ваш шаблон, выведите имя файла с помощью «-l» на grep, а затем используйте его в качестве входных данных для cat.
или
Я подозреваю, что вы можете заполнить оставшиеся детали. Кстати, если у вас могут быть пробелы или другие нечетные символы в именах файлов (маловероятно в данном конкретном случае, но для будущих целей), используйте -print0 для поиска и -Z для grep в сочетании с параметром -0 для использования в xargs нулевые байты между именами файлов, а не символами новой строки.
источник
\+
а не\;
избегать этой проблемы, но я не знаю, как это работает с парой аргументов -exec (подозреваю, «плохо»). Используя пару xargs, у вас будет только пара новых процессов, которые должны быть быстрее с большим количеством файлов.>afile
или|acommand
или то , что подходит для вашей ситуации. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
вместоxargs sudo
. Когда вы запускаетеxargs sudo
, он строит командную строку, предполагая, что командаsudo cat args
. Но cat находится в / bin, поэтому sudo запускается/bin/cat args
. Если ваша команда находится в более длинном каталоге, например / usr / local / bin, то команда sudo, фактически выполняемая, может привести к слишком длинной командной строке и ошибке, которую трудно отследить. Кроме того,sudo xargs
просто регистрирует, что вы запустили xargs, в то время какxargs sudo
регистрирует команду со всеми аргументами, что приводит к некоторым длинным строкам журнала sudo. :)Это не совсем оптимальный код, но он очень прост и будет хорошо работать, если эффективность не является проблемой. Проблема в том, что он будет просматривать файлы несколько раз, даже если в них уже найдена строка.
Во-первых, найдите ваши строки и запишите соответствующие файлы в список.
Повторите этот шаг, заменив
searchPattern
при необходимости. Это создает список подходящих файлов в/tmp/file_list
.Проблема в том, что в этом файле могут быть дубликаты. Следовательно, мы можем заменить дубликаты на
|sort|uniq
.sort
Часть помещает дублированные рядом друг с другом, так чтоuniq
их можно удалить. Затем вы можете использоватьcat
эти файлы вместеxargs
(с каждым именем файла, разделенным символом новой строки\n
). Следовательно,В отличие от других ответов, здесь есть два шага и временный файл, поэтому я действительно рекомендую его, только если у вас есть несколько шаблонов для поиска.
источник
В зависимости от вашей оболочки и среды вы можете сделать что-то вроде этого (в bash)
Если вы хотите разделить результаты в соответствии с шаблоном, вы можете изменить это на что-то вроде
источник
while
цикл читает этот список и выполняетgrep
/ условнуюcat
часть.#!/bin/bash
, сделать его исполняемымchmod +x recoverData.sh
и выполнить его с помощью./recoverData.sh
. Как не использовать ,sh recoverData.sh
так как/bin/sh
, скорее всего,dash
оболочка .