Comprimi un archivio senza includere la directory principale


30

Voglio comprimere molte cartelle in un albero di directory in questo modo

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Quando provo a comprimerlo, termina la creazione di un archivio zip con la cartella v anziché il suo contenuto (sottodirectory e file)

Come posso evitarlo?

Risposte:


23

Quindi, se ho capito bene, stai cercando di archiviare i file e le cartelle in una determinata cartella ma senza includere la cartella principale.

Esempio:

/test/test.txt
/test/test2.txt

dove test.txt e test2.txt sarebbero memorizzati nella zip, ma non / test /

Puoi cd nella directory / test / quindi eseguire qualcosa del tipo,

zip -r filename.zip ./*

Che creerebbe un archivio nella stessa cartella denominata nomefile.zip. O se eseguendolo dall'esterno della cartella potresti eseguire,

zip -r test.zip test/*

/ * È la parte che include solo il contenuto della cartella, anziché l'intera cartella.

Modifica: OP voleva più zip, la soluzione è risultata essere un po 'un trucco, sono curioso di sapere se esiste un modo migliore per farlo.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

sì, ma ho un sacco di file su cui faccio la stessa cosa, quindi sarebbe noioso farlo così, quindi c'è uno script bash o qualcosa che automatizzerebbe lo stesso processo nella directory che ha tutte le cartelle
Dami

1
Ok ho eseguito lo script e ha creato una directory principale nell'archivio Voglio solo il contenuto della cartella sia nell'archivio
Dami,

1
errore mio, ne ho perso un po '. aggiunto un parametro -j che ho appena cercato, apparentemente salta la parte che non vuoi. prova questo:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb,

18
zip -r test.zip test / * dall'esterno aggiunge test come directory nel file zip
smihael

4
come ha affermato @smihael, zip -r test.zip test/*non funziona. c'è un modo corretto per ottenere questo dall'esterno della directory?
Andrhamm,

22

Utilizzare l' opzione -jo --junk-pathsnel comando zip.

Dalla pagina man zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

Questa sembra essere la risposta corretta.
mutant_city

3
Che dire dei percorsi / cartelle nidificati però?
GuyPaddock,

3
Ciò ometterà tutte le cartelle nell'archivio e se si hanno nomi di file duplicati in cartelle diverse, ciò esploderà. Questo ha il suo posto, ma solo se non ti interessano le cartelle e vuoi solo i file. Non quello che l'OP stava chiedendo, ma comunque una buona conoscenza
Govind Rai

17

Che ne dici di questo comando?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Mentre questa è una risposta corretta, l'introduzione non sembra che tu sia convinto. Aiuterebbe anche a spiegare un po 'cosa fa il comando.
Nephente,

1
Anche questa era la mia soluzione, ma non mi piace perché comporta cd. Speravo che ci fosse un modo per specificare il percorso memorizzato in modo più preciso.
nilskp,

3

Spero che sia di aiuto.

(cd directory && zip -r ../out.zip .)

Mantiene la shell principale nella stessa directory e cambia solo la directory della sub-shell che muore dopo il comando.


Volevo aggiungere questo come commento alla risposta di @Alfred UC , ma non ho abbastanza reputazione per questo.
Kenneth il

Se risolve effettivamente il problema, potrebbe essere una soluzione.
Yufenyuy Veyeh Dider,

Questo è meglio come una risposta. Funziona sia in bash che in sh?
Arlen Beiler,
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.