2011-11-17 12 views
11

Desidero comprimere una sottodirectory e inviarla altrove, il problema è che quando utilizzo il comando zip include anche tutti i livelli indesiderati di directory che non desidero.Sottocartella zix di Unix che non include la directory principale

ad es.

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###unzipped produces the following 
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###I want 
/wanted1/wanted2/file.txt 

aggiornamento: la directory che voglio comprimere ha un sacco di directory annidate, da cui il -r. Inoltre sarebbe bello affrontare percorsi assoluti, la vecchia soluzione usata per creare cd sul posto, ma a me proprio non piaceva. Forse è il modo migliore (solo).

+0

Il '-r' significa ricorsivo. Se hai davvero bisogno di usarlo, allora dovresti leggere le opzioni zip per escludere. Se si desidera semplicemente comprimere un file, cd nella directory principale appropriata (secondo l'esempio) ./Unwanted1/Unwanted2 e quindi "zip new.zip voluto/file.txt". Vale a dire, non penso che ci sia un'opzione zip che significa 'scartare i primi n livelli di informazioni sulla sottodirectory sul nome file di input'. In bocca al lupo. – shellter

+0

Da allora hai modificato il tuo esempio, che cambia il gioco di una certa quantità. Di solito le persone non vogliono percorsi assoluti come quello. Ci potrebbero essere più opzioni di tracciamento/controllo del percorso all'interno di "zip", ma ne dubito. Leggi la pagina man. Oppure passa a "tar" e leggi la pagina man (ugualmente lunga). E non hai ancora bisogno di -r se stai aggiungendo un singolo file, non importa quanto profondo. – IcarusNM

risposta

16

È necessario modificare le directory ovunque si desideri avviare, o forse c'è un'opzione per 'zip' per farlo per voi. Se sei troppo pigro per leggere le opzioni di gazillion nella pagina man, come lo sono io, solo 'cd' prima, anche in una sceneggiatura. Oppure si può racchiudere il tutto tra parentesi senza influenzare la shell o directory di lavoro dello script:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt) 

, ovvero dal momento che si sta utilizzando -r si desidera presumibilmente più di un semplice file.txt, quindi:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted) 

Oppure utilizzare pushd/popd per saltare in/out:

pushd Unwanted1/Unwanted2 
zip -r ~/new.zip wanted 
popd 

Questo funziona in sh/bash/csh/tcsh.

3

più semplice, così idiomatica:

(cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt) 

Ora zip, tar, rar, cpio e gli amici tutti hanno opzioni per gestire lo stesso, ma possono variare da versione a versione e sicuramente da utility di archiviazione per utilità di archiviazione. Vi suggerisco di imparare a lavorare con la shell per fare il lavoro, e si può usare qualsiasi formato di archivio desiderato

Un altro modo:

(cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip [email protected] 
+0

Per quanto preferirei un flag/opzione in 'zip' per omettere la struttura della cartella genitore, non sembra che questo sia un modo migliore. Entrambi i flag '-j' o' -D' non hanno fatto ciò che volevamo su una struttura di sottocartelle complessa. – paperclip

3

Beh un modo semplice intorno potrebbe essere quella di fare

cd ./Unwanted1/Unwanted2 
zip -r ../../new.zip ./wanted/file.txt 

Ma non so quale sia la vostra situazione. Forse hai bisogno di correre dalla directory di base? Anche l'opzione "-r" viene utilizzata quando si desidera attraversare ricorsivamente le directory: l'esempio fornito utilizza un solo file.

+0

Grazie in realtà è più directory e file, l'esempio è v.semplice –

+0

Sì, proprio come Icaro e se dici, se si racchiudono i comandi tra parentesi, non rovina la directory di lavoro corrente dopo che è stata completata l'esecuzione. – loosebazooka

Problemi correlati