Можно попытаться использовать file
, например:
$ file test.sh.gz
test.sh.gz: gzip compressed data, was "test.sh", from Unix, last modified: Wed Feb 6 14:35:33 2013
Вместо того, чтобы выводить шаблон, введите имя файла, используя "-l" на графике, а затем используйте его как ввод для кошки.
find ./recup*/ -name '*.txt' -print | xargs grep -li "searchPattern" | xargs cat
или
cat $( find ./recup*/ -name '*.txt' -print | xargs grep -li "searchPattern")
Я подозреваю, что вы можете заполнить оставшиеся данные. Кстати, если у вас могут быть пробелы или другие нечетные символы в именах файлов (маловероятно в данном конкретном случае, но для будущих целей), используйте -print0 на find и -Z на grep, в сочетании с опцией -0 на xargs, чтобы использовать нулевые байты между именами файлов, а не новые строки.
find ./recup*/ -name '*.txt' -print0 | xargs -0 grep -Zli "searchPattern" | xargs -0 cat
В зависимости от вашей оболочки и окружения, вы можете установить что-то подобное (в bash)
while IFS= read -r -d '' file; do
if grep -qim1 'searchPattern1\|searchPattern2\|searchPattern3' "$file"; then
cat "$file" >> some/other/file
fi
done < <(find ./recup*/ -name '*.txt' -print0)
Если вы хотите разделить результаты по шаблону, вы можете изменить это на что-то подобное
while IFS= read -r -d '' file; do
if grep -qim1 'searchPattern1' "$file"; then
cat "$file" >> some/other/file1
elif grep -qim1 'searchPattern2' "$file"; then
cat "$file" >> some/other/file2
elif grep -qim1 'searchPattern3' "$file"; then
cat "$file" >> some/other/file3
fi
done < <(find ./recup*/ -name '*.txt' -print0)
Это не совсем оптимальный код, но он очень простой и будет работать нормально, если эффективность не является проблемой. Проблема в том, что он будет просматривать файлы несколько раз, даже если строка в них уже была найдена.
Во-первых, найдите свои строки и запишите соответствующие файлы в список.
find ./recup*/ -name '*.txt' -execdir grep -il "searchPattern" {} >> /tmp/file_list \;
Повторите этот шаг, при необходимости заменив searchPattern
. Это создает список совпадающих файлов в / tmp / file_list
.
Проблема в том, что в этом файле могут быть дубликаты. Следовательно, мы можем заменить дубликаты на | sort | uniq
. Часть sort
размещает дубликаты рядом друг с другом, так что uniq
может их удалить. Затем вы можете cat
эти файлы вместе, используя xargs
(с каждым именем файла, разделенным новой строкой \ n
). Следовательно,
</tmp/file_list sort | uniq | xargs -d "\n" cat > final_file.txt
В отличие от других ответов, в нем есть два шага и временный файл, поэтому я бы действительно рекомендовал его только в том случае, если у вас есть несколько шаблонов для поиска.
Если я правильно понимаю свою цель, следующее будет делать то, что вы хотите:
find ./recup*/ -name '*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt
Это будет выглядеть все *. TXT
файлы в ./recup*/
, тестируйте каждый для поиска
, если он соответствует этому CAT
файл. Выход всех файлов
файлов
будет направлен в Oddeffile.txt
.
Повторите для каждого шаблона и выходного файла.
Если у вас очень большое количество каталогов сопоставления ./ Recup *
, вы можете в конечном итоге со списком аргументов
. Простой способ вокруг этого состоит в том, чтобы сделать что-то вроде этого вместо этого:
find ./ -mindepth 2 -path './recup*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt
Это будет соответствовать полный путь. Итак ./ Recup01234 / foo / bar.txt
будет сопоставлено. -Mindepth 2
так, что он не будет совпадать ./ recup.txt
, или ./ Recup0.txt
.