libarchiveDie bsdtarmeisten 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) findmit:
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*jpgDateien 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 zipoder tgzDateien in Verkleidung wie .jaroder .docxDateien sind. Sie können diese zu Ihrem find/ zshSuchmuster 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*.jpgoben auf dem vollständigen Pfad des Archivmitglieds nicht nur der Dateiname übereinstimmt, vacation.jpgsondern 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 pFlag 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 tarImplementierungen, die angezeigten Dateinamen beschädigt werden, wenn sie Zeichen wie Zeilenumbruch oder Backslash (gerendert als \noder \\) enthalten.