Команда, которую я пытаюсь (поскольку я пытаюсь найти тары с «butterflyinmotion.com» в качестве каталога в них), такова:

find / -name "*.tar.gz" -exec tar -tzf {} \; | grep -W butterflyinmotion

Это показывает много ошибок и не работает. Команда grep -W необходима, чтобы я знал, в каком файле находится резервная копия Butterflyinmotion.com. Спасибо!

0
user394550 10 Фев 2020 в 01:20
Если вы используете gnu grep, то нет опции -W, которая является по крайней мере одной из причин, по которой вы получаете ошибки. Если вам просто нужно имя файла, в котором появляется строка, используйте параметр -l. Если вам нужны и строка, и имя файла, используйте параметр -H. Наконец, добавьте ожидаемый вывод к вашему вопросу.
 – 
Nasir Riley
10 Фев 2020 в 01:38
Существует возможность отображать имена файлов (либо -l, либо -L) для grep, но это работает, потому что все, что grep видит, представляет собой поток строк.
 – 
Baard Kopperud
10 Фев 2020 в 02:16
Может быть хорошей идеей добавить 2> /dev/null между \; и | grep, чтобы удалить все эти ошибки "отказано в доступе".
 – 
Baard Kopperud
10 Фев 2020 в 02:34

2 ответа

Я думаю, было бы проще сделать небольшой скрипт и вызывать его с помощью find -exec.

Например:

#!/bin/sh
echo ">>> $1"
tar tvf "$1"

Вызовите его с помощью -exec ./script.sh "{}" \; и перенаправить результат в файл, затем выполнить поиск файла egrep '>>>|WhatYouLookFor' file

Вы также можете использовать grep в сценарии:

#!/bin/sh
echo ">>> $1"
tar tvf "$1" | grep 'WhatYouLookFor'

Или более гибкий:

#!/bin/sh
echo ">>> $2"
tar tvf "$2" | grep "$1"

Вызовите его с помощью -exec ./script.sh 'WhatYouLookFor' "{}" \;

0
Baard Kopperud 10 Фев 2020 в 02:30

По крайней мере, с GNU grep вы можете сделать что-то вроде этого:

find / -name '*.tar.gz' -exec sh -c '
  for t; do 
    tar -tvf "$t" | grep -m1 -l --label="$t" "butterflyinmotion"
  done
' {} + 2>/dev/null

Это выведет имена .tar.gz файлов, архивы которых содержат хотя бы одно совпадение шаблона butterflyinmotion


С GNU tar кажется возможным (по крайней мере, для простых шаблонов) опустить grep и использовать статус выхода tar -tf напрямую, например.

find / -name '*.tar.gz' -exec tar --wildcards -tf {} '*butterflyinmotion' \; -print 2>/dev/null

Вышеприведенное напечатает соответствующие файлы (если они есть), за которыми следует имя архива.

0
steeldriver 10 Фев 2020 в 03:34