Jak wyświetlić zawartość wszystkich plików .zip w folderze i grep dla określonego pliku?

28

Mam 348 plików zip i chcę znaleźć plik, który znajduje się w jednym z plików zip, unzip -lczy nie działa z dzikimi kartami?

Jak mogę wyświetlić zawartość wszystkich .zipplików i greppoprzez scaloną listę wszystkich plików zawartych w zamkach?

Eduard Florinescu
źródło

Odpowiedzi:

17

Korzystanie zipinfojest tutaj dobrym rozwiązaniem. Jednak na ogół, gdy chcesz zastosować polecenie do listy plików, a polecenie nie akceptuje listy plików, możesz użyć forpętli:

for file in *.zip; do
    unzip -l "$file"
done \
| grep "\.zip\|setup"

Jeśli plik, którego szukasz, zawiera spacje, takie jak your file:, w wyrażeniu regularnym grep musisz uciec każdego spacji ukośnikiem odwrotnym grep "\.zip\|your\ file".

Konrad Rudolph
źródło
Działa doskonale, jedynym problemem jest to, że nie wyświetla nazwy zip,
Eduard Florinescu,
Zredagowałem cię i dodałem wyrażenie regularne, aby wyświetlić także nazwę pliku, w którym znaleziono konfigurację, +1 i zaakceptuj
Eduard Florinescu,
O tak, zapomniałem cytatów wokół argumentu unzip, jak żenujące.
Konrad Rudolph
1
@JaySullivan Nie używaj tego kodu, nie powiedzie się w przypadku ścieżek zawierających spacje. Nigdy nie przesyłaj danych wyjściowych ls. Państwo mogli używać findzamiast.
Konrad Rudolph
12

Możesz użyć zipinfo. Jest on zawarty w domyślnej instalacji Ubuntu. Sprawdź stronę podręcznika, aby uzyskać więcej informacji.

Na przykład, aby wyszukać wzór setupw wiązce plików zip w bieżącym katalogu, użyj tego polecenia:

find ./ -iname *zip 2> /dev/null -print0 | xargs -0 zipinfo | grep setup
Anwar
źródło
Dostaję caution: filename not matched: case1.zip... caution: filename not matched: case348.zipza każdy zip, przetestowany na dwóch systemach operacyjnych Ubuntu, 11.10 i 12.04.
Eduard Florinescu
@EduardFlorinescu Wypróbuj zaktualizowaną odpowiedź. Chociaż odpowiedź zadziałała dla mnie
Anwar
problem polega na tym, że plik może to zawierać setupi wyświetla ten sam błąd, chociaż działa tak:zipinfo -l * | grep "setup"
Eduard Florinescu,
Zredagowałem odpowiedź. Myślę, że teraz jest bardziej solidny
Anwar
1
Dzięki, +1 za wysiłek, ale nadal nie będzie działać, jeśli plik zip ma spacje w nazwie.
Eduard Florinescu,
6

Aby wyświetlić listę plików w archiwum zip, możesz użyć następującego polecenia.

unzip -l

Aby grep skompresowane archiwum należy użyć skompresowanych narzędzi archiwizacyjnych zbudowanych do pracy z tego typu formatem archiwum.

W przypadku archiwów zip:

zipgrep --help  
usage: zipgrep [egrep_options] pattern zipfile [members...]
Uses unzip and egrep to search the zip members for a string or pattern.

W przypadku archiwów tar:

zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

OPTIONs are the same as for 'grep'.

Istnieje również kilka innych narzędzi, które działają również z archiwami. Możesz potokować wyjście wstawione do grep, aby zrobić to samo.

zcat
zcat my.archive.zip | grep "some text"

Lub możesz skorzystać z funkcji wyszukiwania tych narzędzi

zless
zmore
nelaaro
źródło