Con una combinazione di bsdtar
di libarchive e GNU tar
, puoi elencare il contenuto di quegli archivi nidificati senza doverli estrarre su disco:
for f in *.zip; do
bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done
GNU tar
può reindirizzare i membri degli archivi ai comandi dopo l'estrazione con --to-command
ma supporta solo tar
formati di archivio.
bsdtar
supporta tutti i tipi di formati di archivio oltre a tar
quelli (incluso zip
quelli), non ha l'equivalente di GNU tar
è --to-command
(AFAIK), ma può convertire i formati di archivio al volo.
Non puoi farlo senza decomprimere effettivamente i file principali in una sottocartella.
Qualcosa del genere:
set -e
for f in *.zip
do
n=`basename -- "${f}" .zip`
mkdir -- "${n}"
cd -- "${n}"
unzip ../"${f}"
for p in *.zip
do
unzip -l -- "${p}"
done
cd ..
rm -rf -- "${n}"
done
Probabilmente dovresti verificare se ${n}
esiste già e in tal caso genera un errore. Puoi anche usare un nome file temporaneo per la sottodirectory:
dir=`mktemp -d zip-files.XXXXXX`
Quindi esegui cd "${dir}"
e rm -rf "${dir}"
una volta fatto.
Aggiornamenti:
Il set -e
viene utilizzato per assicurarsi che se qualcosa va storto, lo script si interrompe. Soprattutto, se mkdir -- "${m}"
fallisce, il cd -- "${m}"
fallirà anch'esso e quindi il cd ..
ti porterebbe al livello di directory sbagliato ed è lì che il rm -rf -- "${n}"
diventa pericoloso.
Un altro modo per creare il cd ..
un'istruzione più sicura è memorizzare quella directory prima del for
loop e usa quel percorso in questo modo:
topdir=`pwd`
for ...
do
...
cd "$topdir" # instead of `cd ..`
...
done
In questo modo il rm -rf -- "${n}"
funzionerà solo in $topdir
.
L'uso della directory temporanea renderà anche le cose molto più sicure poiché in questo modo, qualunque sia il nome del file nel file zip superiore, la creazione/rimozione della directory funzionerà come previsto.
Se GNU Parallel è installato:
extract_list() {
mkdir "$1"
cd "$1"
unzip ../"$1".zip
parallel unzip -l ::: *.zip
cd ..
rm -rf "$1"
}
export -f extract_list
parallel extract_list {.} ::: *.zip