Decomprimi il contenuto del file, ma senza creare una cartella di archivio


37

Ho un file myarchive.zip che contiene molte directory, file, ecc. Diciamo che questo file myarchive.zip vive in una directory chiamata "b". Bene, quando uso il comando "unzip myarchive.zip", per impostazione predefinita il sistema crea una directory chiamata "myarchive" con il contenuto del file zip. Io non voglio che il sistema di creare questa directory "Archivio Personale" - Voglio solo i contenuti da estrarre alla directory "b". È possibile?

Quello che ho fatto ora è semplicemente emettere un comando "cp" per copiare i file dalla directory appena creata (in questo caso da "myarchive" a "b") dove li voglio.


8
Per impostazione predefinita, unzipnon crea una directory. Il tuo file zip probabilmente ha la directory al suo livello più alto.
Chris Down,

3
È possibile utilizzare mvinvece di cp. mv archive/* .; rmdir archive/o simili.
frostschutz,

Risposte:


45

La mia versione di unzipha -jun'opzione per non creare alcuna directory.

Così

unzip -j /path/to/file.zip

Estrarrà tutti i file nella directory corrente senza ripristinare la struttura della directory memorizzata nel zipfile.

Se si desidera rimuovere solo un livello di directory dall'archivio (estrai myarchive/dir/filecome dir/file, non file), è possibile utilizzare bsdtar(che supporta i zipfile oltre ai tarfile) invece e la sua -sopzione.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'

8
Quando si utilizza -jla struttura di directory dell'archivio non viene ricreata e tutti i file vengono depositati nella cartella di estrazione. Ciò significa che TUTTE le sottocartelle vengono eliminate. Quindi, se avessi zip/A/f1, zip/A/B/f2e zip/A/B/C/f3finiresti con una singola cartella con f1, f2, f3. Diventa funky se hai file con lo stesso nome in diverse sottocartelle. Di solito si desidera semplicemente rilasciare la cartella principale e non l'intera struttura della directory.
Cristian Vrabie,

3
@CristianVrabie, questo è esattamente quello che sto dicendo nella risposta. Ho aggiunto un'alternativa bsdtar per quello che stai chiedendo. Vedi modifica.
Stéphane Chazelas,

3

Sembra che questo sia davvero semplice con bsdtar :

bsdtar --strip-components=1 -xvf file.zip


1

Ciò che la risposta accettata non specifica come fare, come dici nella domanda, se vuoi ancora estrarre in una cartella specifica senza usare i percorsi delle cartelle memorizzati nei file zip, puoi usare l' -jopzione con l' -dopzione in questo modo :

unzip -j /path/to/file.zip -d other_folder

o per il tuo caso

unzip -j myarchive.zip -d b

2
Hai ragione che puoi farlo; ma non creerà le sottodirectory, quindi devi ancora incorporare un altro passaggio; Sono abbastanza sicuro che l'OP voglia rinominare la directory principale dell'archivio con un altro nome ma mantenere la struttura rimanente in quella directory.
Pryftan,

-1

Se eseguire unzip myarchive.zipproduce una directory myarchivecon tutto ciò che contiene, significa che il creatore del file zip ha effettivamente eseguito zip su quella directory.

L'unico modo per creare ciò che desideri è spostare tutti i contenuti all'esterno della directory dopo aver eseguito unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ mostra la directorymyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ mostra il primo livello di myarchive (direttamente in b) }


1
hai anche bisogno di un mv myarchive/.* .per spostare tutti i file nascosti come .gitignore e .htaccess.
Kinjal Dixit,

1
@KinjalDixit Anche quello era il mio pensiero; Antoine ha un difetto fatale nel tuo esempio, come sottolinea Kinjai: perché usi rm -Re perché non stai usando ls -anon stai mostrando se ci sono file dot; ora cosa succede quando corri rm -Re ci sono file dot? Non li hai copiati quindi sono persi. Dovresti davvero risolverlo e forse spiegare la differenza perché è qualcosa che farà inciampare abbastanza i neofiti; e considera questo: cosa succede se non è un archivio che hanno? O se si aggiungono al comando per eliminare l'archivio una volta decompresso?
Pryftan,

Otoh rmdirdovrebbe assicurarsi che sia vuoto prima ... Ma se l'utente non fosse a conoscenza dei file dot, li confonderebbe.
Pryftan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.