Как может я кошка, которую содержание файлов, найденных использованием, находит в единственный файл?

Можно попытаться использовать 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
10
13.09.2014, 01:07
4 ответа

Вместо того, чтобы выводить шаблон, введите имя файла, используя "-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
3
27.01.2020, 20:02

В зависимости от вашей оболочки и окружения, вы можете установить что-то подобное (в 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)
0
27.01.2020, 20:02

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

Во-первых, найдите свои строки и запишите соответствующие файлы в список.

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

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

1
27.01.2020, 20:02

Если я правильно понимаю свою цель, следующее будет делать то, что вы хотите:

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 .

9
27.01.2020, 20:02

Теги

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