34

unzip есть изящная опция -j , в результате чего структура каталогов архива отбрасывается, а все файлы извлекаются в один и тот же каталог.

Есть ли способ заставить tar работать таким же образом? Ничто в справочной странице, кажется, не указывает на это.

Итак, есть ли альтернатива, предпочтительно свободное программное обеспечение, инструмент, который сделает это?

5 ответов5

72

GNU tar живет от фуритурита, поэтому, естественно, также есть несколько вариантов для этого.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Если вы просто хотите удалить несколько сегментов пути, то --strip-components=n или --strip=n часто делают:

 tar xvzf tgz --strip=1

Но также возможно переписать и перезаписать файлы, которые будут извлечены (флаги --transform или --xform и принимают ereg с модификатором /x ):

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

Для перечисления tar вам понадобится дополнительная опция --show-transformed :

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

Я считаю, что варианты перезаписи также работают для упаковки, а не только для извлечения. Но у pax явно более приятный синтаксис.

13

Вы можете сделать это довольно легко в два этапа. При необходимости адаптируйте:

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

pax может сделать это:

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

или же

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

Сначала вы можете проверить операцию замены имени, опустив опцию -r .

1

Возможное решение, которое не требует установки чего-либо.

  1. используйте tar tvf чтобы получить все файлы из tarball
  2. Извлеките эти файлы по отдельности - распакуйте tar в stdout и перенаправьте в $ 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
    

сохранить как extract.sh и запустить как extract.sh myfile.tar . Он также перезапишет любые повторяющиеся имена файлов, встречающиеся в каталогах, извлеченных из архива.

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

Опция -O извлекает файл в стандартный формат и > перенаправляет вывод в файл. Так что в моем примере я извлекаю foo.mp3 и перенаправляю его в bar.mp3. Имена файлов произвольны.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .