tar - вилучення структури каталогів, що відкидає


34

unzipмає чудовий варіант -j, завдяки якому структура каталогів архіву відкидається, а всі файли витягуються в один і той же каталог.

Чи є спосіб зробити tarроботу таким же чином? Ніщо на сторінці чоловіка так не вказує.

Отже, чи є альтернативний, бажано, вільний програмний інструмент, який зробить це?


Відповіді:


79

Дьоготь GNU живе на featuritis, тому, природно, також є деякі варіанти для цього.
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

Для перерахування дьогтю вам потрібна додаткова --show-transformedопція:

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

Я вважаю, що варіанти перезапису також працюють для упаковки, а не лише для видобутку. Але paxмає, очевидно, приємніший синтаксис.


4
Чому ні s#.*/##?
l0b0

3
--смужка просто зробила мій день. Спасибі!
SamStephens

--stripне згадується на сторінці os x tar man, але це все одно працює, дякую!
slf

3
Набагато краща, ніж прийнята відповідь.
Клаату фон Шлакер

чи є різниця між --stripі --strip-components?
Джоел Берклі

13

Ви можете зробити це досить легко за два етапи. За необхідності адаптуйте:

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

ось як я це зробив (використовуючи find -exec mv -iзамість цього find | xargs) .... простими кроками я можу повторитись у будь-якій системі, не маючи при собі виконувати сценарій, щоб зробити це для мене.
крякати кіхот

1
+1, tmpdir=$( mktemp -d )зручно під час створення тимчасових каталогів
сорки

8

pax може це зробити:

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

або

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

Спочатку ви можете перевірити операцію заміни імен, опустивши цю -rопцію.


1

Можливе рішення, яке не вимагає нічого встановлювати.

  1. використовуйте a, tar tvfщоб схопити всі файли з табору
  2. Витягуйте ці файли окремо - маєте витяг tar, щоб stdout & перенаправити на ім'я $ file

    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
    

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


Насправді я просто перевірив його на якомусь дереві вдома, і він не спрацьовує у файлах, що містять пробіли. Я побачу, чи не можу я опублікувати оновлення.
DaveParillo

Виправлено це, але це не так красиво, як це було.
DaveParillo

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

-OОпція витягує файл на стандартний висновок, і >переадресовує цей висновок в файл. Тож у своєму прикладі я видобуваю foo.mp3 і перенаправляю його на bar.mp3. Назви файлів довільні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.