Как извлечь конкретный каталог из архива? и раздеть ведущий каталог?

12

Я хочу извлечь конкретный каталог из архива WordPress. специально wp-includesдля .. Похоже, что структура каталогов внутри архива есть, wordpress/wp-includesно мне нужно только ./wp-includesпосле того, как она будет извлечена, нет ведущего каталога WordPress. Как бы я это сделал?

xenoterracide
источник

Ответы:

13

Чтобы извлечь конкретный каталог (и его содержимое, рекурсивно), просто передайте его в качестве дополнительного аргумента в командной строке. С помощью GNU tar вы можете удалить начальный каталог с помощью --strip-componentsопции (и, в более общем случае, преобразовать имена файлов с помощью --transform). В системах, отличных от Linux, вы можете использовать pax (он есть в POSIX, но некоторые дистрибутивы Linux не включают его в установку по умолчанию) и его -sопцию.

tar xf foo.tar --strip-components=1 wordpress/wp-includes  #GNU tar
pax -r <foo.tar -pp -s '!^wordpress/!!' wordpress/wp-includes

Вы можете объединить список включения с правилами переписывания, добавив правило, чтобы переписать все к пустому имени (что означает «не извлекать»; правило применяется только в том случае, если предыдущие правила не совпадали).

pax -r <foo.tar -pp -s '!^wordpress/\(wp-includes/\)!\1!' -s !.*!!
Жиль "ТАК - перестань быть злым"
источник
5

Предполагая, что у вас есть GNU tar, вы можете использовать --strip-components:

$ tar xaf tarball.tar.gz --strip=1 wordpress/wp-includes

Я считаю, что текущие версии BSD tar также поддерживают --strip-components. В худшем случае вы можете сделать:

$ tar xzf tarball.tar.gz wordpress/wp-includes
$ mv wordpress/wp-includes .
$ rmdir wordpress
CJM
источник
Я закончил тем, что делал последнее только потому, что спешил, но приятно знать, что первое существует.
ксенотеррацид
Можно ли будет использовать команду, которая не требует явного присвоения имени выделенному компоненту (например wordpress)? Мне это нужно, когда я извлекаю созданные GitHub тарболы, которые содержат ревизию git в разобранном компоненте, который я заранее не знаю.
tjanez