libarchive
Die bsdtar
meisten dieser Dateiformate können verarbeitet werden. Sie können also Folgendes tun:
find . \( -name '*.zip' -o \
-name '*.tar' -o \
-name '*.tar.gz' -o \
-name '*.tar.bz2' -o \
-name '*.tar.xz' -o \
-name '*.tgz' -o \
-name '*.tbz2' -o \
-name '*.7z' -o \
-name '*.iso' -o \
-name '*.cpio' -o \
-name '*.a' -o \
-name '*.ar' \) \
-type f \
-exec bsdtar tf {} '*vacation*jpg' \; 2> /dev/null
Was Sie mit GNU vereinfachen (und verbessern können, um die Groß- und Kleinschreibung nicht zu berücksichtigen) find
mit:
find . -regextype egrep \
-iregex '.*\.(zip|7z|iso|cpio|ar?|tar(|\.[gx]z|\.bz2)|tgz|tbz2)' \
-type f \
-exec bsdtar tf {} '*vacation*jpg' \; 2> /dev/null
Der Pfad des Archivs, in dem sich diese *vacation*jpg
Dateien befinden, wird jedoch nicht gedruckt . Um diesen Namen zu drucken, können Sie die letzte Zeile durch Folgendes ersetzen:
-exec sh -ac '
for ARCHIVE do
bsdtar tf "$ARCHIVE" "*vacation*jpg" |
awk '\''{print ENVIRON["ARCHIVE"] ": " $0}'\''
done' sh {} + 2> /dev/null
das gibt eine Ausgabe wie:
./a.zip: foo/blah_vacation.jpg
./a.zip: bar/blih_vacation.jpg
./a.tar.gz: foo/blah_vacation.jpg
./a.tar.gz: bar/blih_vacation.jpg
Oder mit zsh
:
setopt extendedglob # best in ~/.zshrc
for archive (**/*.(#i)(zip|7z|iso|cpio|a|ar|tar(|.gz|.xz|.bz2)|tgz|tbz2)(.ND)) {
matches=("${(f@)$(bsdtar tf $archive '*vacation*jpg' 2> /dev/null)"})
(($#matches)) && printf '%s\n' "$archive: "$^matches
}
Beachten Sie, dass es eine Reihe anderer Dateiformate gibt, die nur zip
oder tgz
Dateien in Verkleidung wie .jar
oder .docx
Dateien sind. Sie können diese zu Ihrem find
/ zsh
Suchmuster hinzufügen.bsdtar
ohne sich um die Erweiterung zu kümmern (wie in, es hängt nicht von der Erweiterung ab, um den Dateityp zu bestimmen).
Beachten Sie, dass *vacation*.jpg
oben auf dem vollständigen Pfad des Archivmitglieds nicht nur der Dateiname übereinstimmt, vacation.jpg
sondern auch auf vacation/2014/file.jpg
.
Um nur mit dem Dateinamen übereinzustimmen , besteht ein Trick darin, den Extraktionsmodus zu verwenden . Verwenden Sie -s
(Ersetzung), bei dem reguläre Ausdrücke mit einem p
Flag verwendet werden, um die Namen der übereinstimmenden Dateien zu drucken, und stellen Sie dann sicher, dass keine Datei extrahiert wird, wie z.
bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"
Beachten Sie, dass die Liste auf stderr ausgegeben und >>
an jede Zeile angehängt wird. In jedem Fall können bsdtar
, wie bei den meisten tar
Implementierungen, die angezeigten Dateinamen beschädigt werden, wenn sie Zeichen wie Zeilenumbruch oder Backslash (gerendert als \n
oder \\
) enthalten.