it-swarm-eu.dev

tar - estrae la struttura delle directory di scarto

unzip ha una nifty opzione -j, in cui la struttura di directory dell'archivio viene scartata e tutti i file vengono estratti nella stessa directory.

C'è un modo per far funzionare tar allo stesso modo? Nulla nella pagina man sembra indicare così.

Quindi, c'è uno strumento alternativo, preferibilmente Free Software, che lo farà?

34
Benji XVI

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

Se vuoi solo rimuovere alcuni segmenti di percorso, allora --strip-components=n o --strip=n spesso faranno:

 tar xvzf tgz --strip=1

Ma è anche possibile regex-riscrivere i file da estrarre (i flag sono --transform o --xform e accettano ereg con il modif /x):

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

Per elencare un tar è necessario l'opzione --show-transformed 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 pax ha ovviamente una sintassi migliore.

74
mario

Puoi farlo abbastanza facilmente in due passaggi. Adeguare 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
13
MikeyB

pax può farlo:

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

o

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

Puoi prima controllare l'operazione di sostituzione del nome omettendo l'opzione -r.

8
hfs

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

  1. usa un tar tvf per prendere tutti i file dal tarball
  2. Estrai questi file individualmente - estrai tar su stdout e reindirizza su $ filename

    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 incontrati nelle directory estratte dal tarball.

1
DaveParillo