(Na podstawie Jak rekurencyjnie przeglądać skompresowane archiwa? )
Zainstaluj system plików AVFS , który zapewnia przejrzysty dostęp do archiwów. Najpierw uruchom to polecenie, aby skonfigurować widok systemu plików komputera, w którym możesz uzyskać dostęp do archiwów tak, jakby były katalogami:
mountavfs
Po tym, jeśli /path/to/archive.zip
jest rozpoznanym archiwum, to ~/.avfs/path/to/archive.zip#
jest katalog, który wydaje się zawierać zawartość archiwum.
find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*vacation*.jpg"
' {} 'Test::Version' \;
Objaśnienia:
- Zamontuj system plików AVFS.
- Poszukaj plików archiwum w
~/.avfs$PWD
, który jest widokiem AVFS bieżącego katalogu.
- Dla każdego archiwum wykonaj określony fragment powłoki (z
$0
= nazwa archiwum i $1
= wzorzec do przeszukania).
$0#
to widok katalogu archiwum $0
.
{\}
raczej niż {}
jest potrzebna w przypadku zewnętrzne find
substytuty {}
wewnątrz -exec ;
argumentów (niektóre to zrobić, niektóre nie).
Lub w zsh ≥4,3:
mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')
Objaśnienia:
~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)
dopasowuje archiwa w widoku AVFS bieżącego katalogu i jego podkatalogów.
PATTERN(e\''CODE'\')
stosuje KOD do każdego dopasowania WZORU. Nazwa dopasowanego pliku znajduje się w $REPLY
. Ustawienie reply
tablicy zmienia dopasowanie w listę nazw.
$REPLY\#
to widok katalogu archiwum.
$REPLY\#/**/*vacation*.jpg
dopasowuje *vacation*.jpg
pliki w archiwum.
N
Glob kwalifikator sprawia, że wzór poszerzyć do pustej listy, jeśli nie ma odpowiednika.
Gilles „SO- przestań być zły”
źródło
Moje zwykłe rozwiązanie:
Przykład:
Rezultaty są jak:
Jeśli chcesz tylko plik zip z trafieniami :
FILENAME tutaj jest używany dwukrotnie, więc możesz użyć zmiennej.
Z Find możesz użyć PATH / TO / SEARCH
źródło
Innym rozwiązaniem, które działa
zgrep
źródło
zgrep
? To nie działa z tym dostarczonym z GNUgzip
(/bin/zgrep: -r: option not supported
,zgrep (gzip) 1.6
)Przyjazność dla użytkowników IMHO powinna być również czymś wyjątkowym:
i dla smoły (ten jest niesprawdzony ...)
źródło
unzip
implementacja może poradzić sobie z plikami 7z lub tar.gz?libarchive
„sbsdtar
może obsługiwać większość z tych formatów, więc można zrobić:Które możesz uprościć (i ulepszyć, aby dopasować bez rozróżniania wielkości liter) z GNU za
find
pomocą:Nie powoduje to jednak wydrukowania ścieżki do archiwum, w którym znajdują się te
*vacation*jpg
pliki. Aby wydrukować tę nazwę, możesz zastąpić ostatni wiersz:co daje wynik taki jak:
Lub z
zsh
:Należy pamiętać, że istnieje wiele innych formatów plików, które są po prostu
zip
lubtgz
pliki w przebraniu, takie jak.jar
lub.docx
pliki. Możesz dodać je do wzorcafind
/zsh
wyszukiwania,bsdtar
nie przejmuje się rozszerzeniem (jak w, to nie zależy od rozszerzenia, aby określić typ pliku).Zauważ, że
*vacation*.jpg
powyższe jest dopasowane do pełnej ścieżki członka archiwum, nie tylko do nazwy pliku, więc pasowałoby do,vacation.jpg
ale także dovacation/2014/file.jpg
.Aby dopasować tylko nazwę pliku, jedną sztuczką byłoby użycie trybu wypakowania , użycie
-s
(podstawienie), które używa wyrażeń regularnych zp
flagą do wydrukowania nazw pasujących plików, a następnie upewnienie się, że żaden plik nie jest wyodrębniony, na przykład:Zauważ, że wypisuje listę na stderr i dołącza
>>
do każdej linii. W każdym razie,bsdtar
podobnie jak większośćtar
implementacji, może zmieniać nazwy wyświetlanych plików, jeśli zawierają one znaki takie jak znak nowej linii lub ukośnik odwrotny (renderowane jako\n
lub\\
).źródło