Evita percorsi indesiderati nel file Zip


49

Sto realizzando uno script shell per impacchettare alcuni file. Sto comprimendo una directory come questa:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

Il problema è che l'archivio out.zip risultante contiene l'intero percorso del file. Cioè, quando decompresso, avrà l'intero percorso "/ Users / me / development / anotherthing /". È possibile evitare questi percorsi profondi quando si inserisce una directory in un archivio?

Quando eseguo zip dall'interno della directory di destinazione, non ho questo problema.

zip -r out.zip ./folder/

In questo caso, non ricevo tutta la spazzatura. Tuttavia, lo script in questione verrà chiamato da qualsiasi luogo.

FWIW, sto usando bash su Mac OS X 10.6.

Risposte:


85

Lo script dovrebbe usare cdo pushde popddi trasferirsi nella directory che sarà la radice dell'archivio prima che il rilascio del zipcomando. Come fare esattamente questo dipenderà da come lo script sa cosa comprimere. Ma, se vuoi / Users / me / development / qualcosa / cartella compresso con percorsi interni di solo ./folder , dovresti farlo:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

Ciò comporterà out.zip contenente i relativi percorsi desiderati.

Se hai bisogno di assistenza per lo scripting, dovrai mostrarci il tuo script.


8
nessun problema. lo faccio sempre con una riga sulla riga di comando, ad esempio: $ pushd /some/path ; do-something ; popd... o anche con i subshells:$ ( cd /some/path ; do-something )
Quack Quixote

1
@ ~ ciarlatano: +1 soprattutto per la tecnica della sotto-shell nel commento.
Jonathan Leffler

1
Anche se usare al &&posto di ;è una buona idea in modo che l'altro comando non venga eseguito in caso di cderrore (errore di battitura o altro problema):(cd /some/path && do-something)
Chris Johnsen

3
Non esiste un modo per farlo senza specificare il percorso assoluto per il file zip?
orange80,

2
Perché stai giocando con il percorso? Perché non usare zip -j?
JWW

5

Il problema è che l'archivio out.zip risultante contiene l'intero percorso del file.
...
È possibile evitare questi percorsi profondi quando si inserisce una directory in un archivio?

Sì. Usa l' -jopzione con zip. -jè "junk the path". Secondo la pagina man su zip :

Memorizza solo il nome di un file salvato (junk the path) e non memorizzare i nomi delle directory. Per impostazione predefinita, zip memorizzerà il percorso completo (relativo alla directory corrente).

Utilizzando -jsignifica il seguente comando:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

Creerà un archivio simile a:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

5
Anche questo non fa junk tutti i percorsi, anche quelli nella directory 'cartella'? Penso che l'OP voglia solo sbarazzarsi del percorso sulla riga di comando.
Peter Jaric,

1
Questa potrebbe non essere la risposta a questa domanda, ma è ciò di cui ho bisogno.
Aaron McMillin,

1
Questa risposta presuppone erroneamente che l'utente desideri una zip piatta. Questo è un presupposto negativo e può causare il fallimento dello script se due file in diverse sottocartelle hanno lo stesso nome.
Andrew Schwartz,

1

C'è pushde popde $OLDPWD. Supponendo che $PWDsia /Users/me/developmentfare:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

Ora $PWDè tornato a/Users/me/development

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.