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.