2012-12-18 15 views
14

Quando si tenta di comprimere i file e le directory con tar utilizzando percorsi assoluti, il percorso assoluto viene conservato nel file compresso risultante. Ho bisogno di usare percorsi assoluti per dire a tar dove si trova la cartella che desidero comprimere, ma voglio solo comprimerla, non l'intero percorso.tar Unix: non conservare la struttura delle directory

Ad esempio, tar -cvzf test.tar.gz /home/path/test - dove voglio comprimere la cartella test. Tuttavia, quello che effettivamente finisco per comprimere è /home/path/test. C'è qualcosa che può essere fatto per evitare questo? Ho provato a giocare con l'operando -C inutilmente.

+0

Esiste un contesto di programmazione per questo? In caso contrario, probabilmente appartiene a Unix.SE anziché a Stack Overflow. – dmckee

+0

true, anche se questo potrebbe essere rilevante in shellscripting, non è codificato come tale .. –

+0

Lo sto usando per uno script di shell, ma ho ridotto il problema a uno esterno al contesto. Potrei aver bisogno di fornire dettagli extra (ovvero il contesto) per trovare una soluzione, quindi l'ho postata qui. Lo etichetterò come tale ora. –

risposta

17

Usa -C per specificare la directory da cui i file sembrano desideri, e quindi specificare i file come si è visto da quella directory:

tar -cvzf test.tar.gz -C /home/path test 
+1

Questo conserva ancora la struttura della directory * relativa * alla directory radice specificata, che non è quello che sembra essere la domanda (anche se apparentemente è necessario OP), ma +1 perché è esattamente quello che stavo cercando (e l'approccio unilaterale appiattito nell'altra risposta sembra una cosa bizzarra da volere). –

23

Questo è brutto ... ma funziona ...

Ho avuto lo stesso problema ma con più cartelle, volevo semplicemente appiattire tutti i file. Puoi usare l'opzione "trasforma" per passare un'espressione sed e ... funziona come previsto.

questa è l'espressione:

's/.*\///g' (cancellare tutto prima '/')

Questo è il comando finale:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info 
+5

Questa è l'unica risposta che ho visto che * effettivamente * fa quello che sto cercando. –

+0

È possibile ottenere risultati migliori per più directory in combinazione con http://serverfault.com/a/566345/343194. Qualcosa come 'find ./commondir -type f | tar --transform 's /.*\/// g' -cvzf ./file.tar.gz --files-from =/dev/stdin'. In questo modo verranno escluse le directory figlio vuote. –

0

multi-directory esempio

tar cvzf mia .tar.gz example.zip -C dir1 files_under_dir1 -C dir2 files_under_dir2

i file sotto dir 1/2 non dovrebbero avere percorso.

Problemi correlati