GNU/Linux >> Linux Esercitazione >  >> Linux

Quale metodo utilizza Unzip per trovare un singolo file in un archivio?

Diciamo che creo 100 file con dati di testo casuali di dimensioni 30 MB ciascuno. Ora creo un archivio zip con compressione 0 cioè zip dataset.zip -r -0 *.txt . Ora voglio estrarre un solo file da questo archivio.

Come descritto qui, ci sono due modi per decomprimere/estrarre file dagli archivi:

  1. Cerca la fine del file e cerca la directory centrale. Quindi usalo per un rapido accesso casuale al file da estrarre.(Ammortizzato O(1) complessità)
  2. Guarda ogni intestazione locale ed estrai quella dove c'è una corrispondenza.(O(n) complessità)

Quale metodo utilizza unzip? Dai miei esperimenti sembra che utilizzi il metodo 2?

Risposta accettata:

Quando cerca un singolo file in un archivio di grandi dimensioni, utilizza il metodo 1, che puoi vedere usando strace :

open("dataset.zip", O_RDONLY)           = 3
ioctl(1, TIOCGWINSZ, 0x7fff9a895920)    = -1 ENOTTY (Inappropriate ioctl for device)
write(1, "Archive:  dataset.zip\n", 22Archive:  dataset.zip
) = 22
lseek(3, 943718400, SEEK_SET)           = 943718400
read(3, "\340P\356(s\342\306\205\201\27\360U[\250/2\207\346<\252+u\234\225\1[<\2310E\342\274"..., 4522) = 4522
lseek(3, 943722880, SEEK_SET)           = 943722880
read(3, "\3\f\225P\\ux\v\0\1\4\350\3\0\0\4\350\3\0\0", 20) = 20
lseek(3, 943718400, SEEK_SET)           = 943718400
read(3, "\340P\356(s\342\306\205\201\27\360U[\250/2\207\346<\252+u\234\225\1[<\2310E\342\274"..., 8192) = 4522
lseek(3, 849346560, SEEK_SET)           = 849346560
read(3, "D\262nv\210\343\240C\24\227\344\367q\300\223\231\306\330\275\266\213\276M\7I'&35\2\234J"..., 8192) = 8192
stat("rand-28.txt", 0x559f43e0a550)     = -1 ENOENT (No such file or directory)
lstat("rand-28.txt", 0x559f43e0a550)    = -1 ENOENT (No such file or directory)
stat("rand-28.txt", 0x559f43e0a550)     = -1 ENOENT (No such file or directory)
lstat("rand-28.txt", 0x559f43e0a550)    = -1 ENOENT (No such file or directory)
open("rand-28.txt", O_RDWR|O_CREAT|O_TRUNC, 0666) = 4
ioctl(1, TIOCGWINSZ, 0x7fff9a895790)    = -1 ENOTTY (Inappropriate ioctl for device)
write(1, " extracting: rand-28.txt        "..., 37 extracting: rand-28.txt             ) = 37
read(3, "\275\3279Y\206\223\217}\355W%:\220YNT\0\257\260z^\361T\242\2\370\21\336\372+\306\310"..., 8192) = 8192

unzip apre dataset.zip , cerca la fine, quindi cerca l'inizio del file richiesto nell'archivio (rand-28.txt , all'offset 849346560) e legge da lì.

La directory centrale si trova scansionando gli ultimi 65557 byte dell'archivio; vedi il codice che inizia qui:

/*---------------------------------------------------------------------------
    Find and process the end-of-central-directory header.  UnZip need only
    check last 65557 bytes of zipfile:  comment may be up to 65535, end-of-
    central-directory record is 18 bytes, and signature itself is 4 bytes;
    add some to allow for appended garbage.  Since ZipInfo is often used as
    a debugging tool, search the whole zipfile if zipinfo_mode is true.
  ---------------------------------------------------------------------------*/

Linux
  1. Cos'è un file .pid e cosa contiene?

  2. Come funziona rm? Cosa fa rm?

  3. Cos'è `S_ISREG()` e cosa fa?

  4. Cosa significa 'rc' in `.bashrc`, ecc.?

  5. Spostare un file mentre è in uso:come funziona?

Comando file Linux:cosa fa e come usarlo

Che cos'è EFS (Elastic File System) in AWS e come utilizzarlo

ExplainShell:scopri cosa fa ogni parte di un comando Linux

Come utilizzare Sed per trovare e sostituire una stringa in un file

scp un singolo file in più posizioni

estrarre un singolo file da un enorme file tgz