Powiedzmy, że mam nazwany plik ugly_name.tar
, który po rozpakowaniu staje się ugly_name
katalogiem. Jakiego polecenia mogę użyć, aby pretty_name
zamiast tego powstała nazwa katalogu ?
124
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):Jeśli
ugly_name
jest najwyższym składnikiem wszystkich nazw plików w archiwum, nie musisz zawracać sobie głowy precyzyjnym dopasowaniem:Jeśli nie znasz nazwy katalogu najwyższego poziomu, nadal możesz skorzystać z tej metody, chociaż możesz
--strip-components
zamiast tego.Za
pax
pomocą narzędzia do archiwizacji POSIX użyj-s
opcji, która przyjmuje jako argument wyrażenie podobne do sed.źródło
Użyj tego :
źródło
&&
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
źródło
--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ą metodymkdir
lub--strip-components 1
, w przeciwnym razie po prostu otrzymaszpretty_name/ugly_name/
.Od askUbuntu ta odpowiedź zadziałała dla mnie:
Aktualizacja
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.źródło
pretty_name
, w którym znajduje się oryginalny katalog najwyższego poziomu. Np. Jeślitar xzf ugly_name.tgz
utworzy katalog o nazwieugly_name/
, wówczas polecenie, które podałeś, utworzypretty_name/ugly_name/
.