Jak wyodrębnić konkretny katalog z tarballa? i usunąć wiodący katalog?

12

Chcę wyodrębnić konkretny katalog z archiwum wordpress. specjalnie wp-includesdla .. Wygląda na to, że struktura katalogów wewnątrz archiwum jest, wordpress/wp-includesale potrzebuję ./wp-includesgo po wyodrębnieniu, bez wiodącego katalogu Wordpress. Jak mam to zrobić?

ksenoterracid
źródło

Odpowiedzi:

13

Aby wyodrębnić określony katalog (i jego zawartość, rekurencyjnie), wystarczy przekazać go jako dodatkowy argument w wierszu poleceń. Za pomocą GNU tar możesz usunąć główny katalog z --strip-componentsopcją (i bardziej ogólnie przekształcić nazwy plików za pomocą --transform). W systemach innych niż Linux możesz użyć pax (jest w POSIX, ale niektóre dystrybucje Linuksa pomijają go podczas domyślnej instalacji) i jego -sopcję.

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

Możesz scalić listę dołączania z regułami przepisywania, dodając regułę, aby przepisać wszystko do pustej nazwy (co oznacza „nie wypakowuj”; reguła ma zastosowanie tylko wtedy, gdy poprzednie reguły nie pasowały).

pax -r <foo.tar -pp -s '!^wordpress/\(wp-includes/\)!\1!' -s !.*!!
Gilles „SO- przestań być zły”
źródło
5

Zakładając, że masz tarę GNU, możesz użyć --strip-components:

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

Wierzę, że obecne wersje tar BSD również obsługują --strip-components. W najgorszym przypadku możesz zrobić:

$ tar xzf tarball.tar.gz wordpress/wp-includes
$ mv wordpress/wp-includes .
$ rmdir wordpress
cjm
źródło
Skończyło się na tym drugim tylko dlatego, że się spieszy, ale dobrze wiedzieć, że ten pierwszy istnieje.
Xenoterracide
Czy byłoby możliwe użycie polecenia, które nie wymaga jawnego nazwania usuniętego komponentu (np. wordpress)? Potrzebuję tego podczas wyodrębniania utworzonych przez GitHub plików archiwalnych, które zawierają wersję git w usuniętym komponencie, którego nie znam z góry.
tjanez,