LINUX.ORG.RU

"нечёткая постановка задачи"

совсем «не извлекать» текст не получится (как иначе узнать, что там «внутри»?). Как мне представляется нужно «распаковывать» в поток и через конвеер искать образец. Кроме того, в архиве может быть несколько файлов (или это не Ваш случай).

anymouze ★★
()

Я не думаю, что это возможно. Но можно конечно использовать опцию -p у unzip или что-то подобное и распаковывать архив прямо в память.

Xenius ★★★★★
()

Проще всего, наверное, взять что-то вроде crgrep (сам не пробовал).

xaizek ★★★★★
()
#!/bin/bash

find "$1" -type f -name '*.zip' | while read archive; do
  unzip -Z1 "$archive" | while read filename; do
    if unzip -p "$archive" "$filename" | grep -q "$2"; then
      echo "$archive: $filename"
    fi
  done
done

./zfind.sh <директория с зипами> '<текст для поиска>'

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)

искать в архиве не распаковывая не возможно, даже в RAM придется распаковывать

двустрочный скрипт нагугли как распаковать все архивы и поиск в баше

missxu
()

zipgrep

Хочется гуй — Double Commander

greenman ★★★★★
()
Ответ на: комментарий от missxu

Херли столько аутистов-то набежало? Человек же явно имел ввиду, что не хочет распаковывать всё на диск. Нет ведь, нужно докопаться до слов.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

caution: filename not matched: caution: filename not matched: caution: filename not matched: caution: filename not matched: caution: filename not matched:

Palamar
() автор топика
Ответ на: комментарий от Palamar

очевидно же

Надо «просмотреть» архивы на наличие файлов TXT. Потом уже в них искать образец, распаковывая на лету (в RAM будет)

# этот код "грубый набросок", только иллюстрация
unzip -l filename.zip | grep '.txt'|... # имена нужно будет ещё отделить от остальной информации о файле
unzip -p filename.zip filename1.txt |grep 'образец для поиска' ... # или с подобной опцией -с
unzip -p filename.zip filename2.txt |grep 'образец для поиска' ...
anymouze ★★
()
Ответ на: комментарий от Palamar

Не работали бы оба варианта, но ошибка была именно из-за пробелов внутри архива, впрочем zipgrep на это должно быть наплевать.

WitcherGeralt ★★
()
Ответ на: комментарий от Palamar

прошу прощения

«это» даже не по 1 архиву — это несколько команд, для иллюстрации (чего-то сегодня туго соображаю)

anymouze ★★
()
Ответ на: комментарий от WitcherGeralt

Хотя нет, надо же запринтить и имя самого архива, возвращаемся к zfind.sh:

#!/bin/bash

find "$1" -type f -name '*.zip' | while read archive; do
  result=$( zipgrep "$2" $archive)
  if [ "$result" ]; then
    echo "# $archive:"
    echo $result
  fi
done
WitcherGeralt ★★
()
Ответ на: комментарий от ashot
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
bash: предупреждение: command substitution: ignored null byte in input
4.zip
bash: предупреждение: command substitution: ignored null byte in input
5.zip
bash: предупреждение: command substitution: ignored null byte in input
6.zip
bash: предупреждение: command substitution: ignored null byte in input
7.zip
bash: предупреждение: command substitution: ignored null byte in input
8.zip
bash: предупреждение: command substitution: ignored null byte in input
Palamar
() автор топика
Ответ на: комментарий от Palamar

У меня bash 4.3.38, там это работает. А начиная с 4.4 что-то сломали.(

ashot ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.