Odpowiedzi:
To powinno działać:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
zmienia określony katalog przed rozpakowaniem (lub spakowaniem). --strip-components
usuwa określoną liczbę katalogów z nazw plików przechowywanych w archiwum.
Pamiętaj, że tak naprawdę nie jest to przenośne. GNU tar i przynajmniej niektóre tary BSD mają taką --strip-components
opcję, ale wydaje się, że nie istnieje na innych platformach uniksowych.
Głupi sposób na zrobienie tego działałby jednak prawie wszędzie.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
katalog. Nawiasem mówiąc, piękno jest w oku patrzącego.
W przypadku GNU tar ≥1,16 użyj, --transform
aby zastosować transformację regexp sed do każdej nazwy pliku (transformacja jest stosowana na pełnej ścieżce w archiwum):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Jeśli ugly_name
jest najwyższym składnikiem wszystkich nazw plików w archiwum, nie musisz zawracać sobie głowy precyzyjnym dopasowaniem:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Jeśli nie znasz nazwy katalogu najwyższego poziomu, nadal możesz skorzystać z tej metody, chociaż możesz --strip-components
zamiast tego.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Za pax
pomocą narzędzia do archiwizacji POSIX użyj -s
opcji, która przyjmuje jako argument wyrażenie podobne do sed.
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Użyj tego :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
operatora listy między tymi dwoma poleceniami, więc drugie zostanie wykonane tylko wtedy, gdy pierwsze się powiedzie.
ugly_name
już istnieje.
Najprostszy sposób
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
bez --strip-components 1
. (2) I odwrotnie, zaakceptowana odpowiedź (opublikowana przez Mat) ma cechy --strip-components 1
bez --one-top-level=pretty_name
. (3) Czy możesz wyjaśnić, dlaczego Twoja odpowiedź, łącząc te opcje, jest lepsza niż którakolwiek ze starszych? Proszę nie odpowiadać w komentarzach; edytuj swoją odpowiedź, aby była jaśniejsza i bardziej kompletna.
--strip-component 1
jest wymagany za pomocą metody mkdir
lub --strip-components 1
, w przeciwnym razie po prostu otrzymasz pretty_name/ugly_name/
.
Od askUbuntu ta odpowiedź zadziałała dla mnie:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--one-top-level [= reż]]
Informuje tar, aby utworzył nowy katalog pod katalogiem rozpakowywania (lub ten przekazany do `-C ') i użyje go do ochrony przed tarbombami. W przypadku braku argumentu dir nazwa nowego katalogu będzie równa podstawowej nazwie archiwum (nazwa pliku minus sufiks archiwum, jeśli zostanie rozpoznany). Wszelkie nazwy członków, które nie zaczynają się od tej nazwy katalogu (po przekształceniu z `--transform 'i` --strip-components') będą poprzedzone nią. Rozpoznawane sufiksy nazw plików to „.tar”, a wszelkie sufiksy kompresji rozpoznawane przez See -auto-compress .
Jak wskazano w komentarzach , ta metoda nie działa w przypadku poprawnie utworzonych archiwów, jednak jak pokazuje inna odpowiedź , należy dodać, --strip-components 1
aby to naprawdę działało. Testowałem z tą nową opcją i działa ona zarówno dla archiwów o nazwie najwyższego poziomu, jak i tych bez.
pretty_name
, w którym znajduje się oryginalny katalog najwyższego poziomu. Np. Jeśli tar xzf ugly_name.tgz
utworzy katalog o nazwie ugly_name/
, wówczas polecenie, które podałeś, utworzy pretty_name/ugly_name/
.