tar - estrae la struttura di directory di scarto


34

unzipha un'opzione elegante -j, per cui la struttura di directory dell'archivio viene scartata e tutti i file vengono estratti nella stessa directory.

C'è un modo di fare il tarlavoro allo stesso modo? Nulla nella pagina man sembra indicarlo.

Quindi, esiste uno strumento alternativo, preferibilmente software libero, che lo farà?


Risposte:


79

Il catrame GNU vive di featurite, quindi naturalmente ha anche alcune opzioni per quello.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Se vuoi solo rimuovere alcuni segmenti di percorso, allora --strip-components=no --strip=nlo farai spesso:

 tar xvzf tgz --strip=1

Ma è anche possibile riscrivere nuovamente i file da estrarre (i flag sono --transformo --xforme accettano ereg con /xmodifer):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Per elencare un tar è necessaria l' --show-transformedopzione aggiuntiva :

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Credo che le opzioni di riscrittura funzionino anche per l'imballaggio, non solo per l'estrazione. Ma paxha ovviamente una sintassi più bella.


4
Perché no s#.*/##?
20

3
--strip ha appena reso la mia giornata. Grazie!
SamStephens,

--stripnon menzionato nella pagina man di os x tar, ma funziona comunque, grazie!
slf

3
Molto meglio della risposta accettata.
Klaatu von Schlacker,

c'è qualche differenza tra --stripe --strip-components?
Joel Berkeley,

13

Puoi farlo abbastanza facilmente in due passaggi. Adattare se necessario:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

è così che lo farei (usando find -exec mv -iinvece di find | xargs) .... semplici passaggi che posso ripetere su qualsiasi sistema senza dover portare in giro uno script per farlo per me.
Quack Quixote,

1
+1, tmpdir=$( mktemp -d )è utile quando si creano directory temporanee
sorki

8

pax puoi farlo:

pax -v -r -s '/.*\///p' < archive.tar

o

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

È possibile verificare prima l'operazione di sostituzione del nome omettendo l' -ropzione.


1

Una possibile soluzione che non richiede l'installazione di nulla.

  1. usa a tar tvfper prendere tutti i file dal tarball
  2. Estrai quei file singolarmente: fai estrarre tar da stdout e reindirizza a $ nomefile

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

salva come extract.sh ed esegui come extract.sh myfile.tar. Sovrascriverà anche i nomi di file duplicati presenti nelle directory estratte dal tarball.


In realtà l'ho appena testato su un albero di dir a casa e fallisce su file contenenti spazi. Vedrò se non riesco a pubblicare un aggiornamento.
DaveParillo,

Risolto il problema, ma non è così bello come lo era.
DaveParillo,

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

L' -Oopzione estrae un file su standard out e >reindirizza l'output in un file. Quindi nel mio esempio sto estraendo foo.mp3 e reindirizzandolo in bar.mp3. I nomi dei file sono arbitrari.

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.