tar - wypakuj odrzucającą strukturę katalogów


34

unzipma fajną opcję -j, dzięki której struktura katalogów archiwum jest odrzucana, a wszystkie pliki są wyodrębniane do tego samego katalogu.

Czy istnieje sposób na wykonanie tarpracy w ten sam sposób? Nic na stronie podręcznika nie wskazuje na to.

Czy istnieje zatem alternatywne, najlepiej Wolne Oprogramowanie, narzędzie, które to zrobi?


Odpowiedzi:


79

Smoła GNU żyje na zapalenie Featuritis, więc naturalnie ma też na to kilka opcji.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Jeśli chcesz po prostu usunąć kilka segmentów ścieżki, wówczas --strip-components=nlub --strip=nczęsto:

 tar xvzf tgz --strip=1

Możliwe jest także ponowne zapisanie plików do wyodrębnienia (flagi są --transformlub --xformakceptują ereg za pomocą /xmodifer):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Aby wyświetlić tar, potrzebujesz dodatkowej --show-transformedopcji:

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

Wierzę, że opcje przepisywania działają również do pakowania, a nie tylko do rozpakowywania. Ale paxma oczywiście ładniejszą składnię.


4
Dlaczego nie s#.*/##?
l0b0,

3
- Taśma właśnie zrobiła mi dzień. Dzięki!
SamStephens

--stripnie wspomniany na stronie podręcznika systemu os x tar, ale i tak działa, dzięki!
slf

3
Znacznie lepiej niż zaakceptowana odpowiedź.
Klaatu von Schlacker

czy jest jakaś różnica między --stripi --strip-components?
Joel Berkeley,

13

Możesz to zrobić dość łatwo w dwóch krokach. Dostosuj w razie potrzeby:

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

tak bym to zrobił (używając find -exec mv -izamiast find | xargs) .... proste kroki, które mogę powtórzyć w dowolnym systemie bez konieczności noszenia ze sobą skryptu, aby to dla mnie zrobić.
quack quixote

1
+1, tmpdir=$( mktemp -d )przydaje się przy tworzeniu tymczasowych katalogów
sorki

8

pax mogę to zrobić:

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

lub

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

Możesz najpierw sprawdzić operację zamiany nazwy, pomijając -ropcję.


1

Możliwe rozwiązanie, które nie wymaga instalowania niczego.

  1. użyj a, tar tvfaby pobrać wszystkie pliki z archiwum
  2. Wyodrębnij te pliki osobno - wypakuj tar na standardowe wyjście i przekieruj na $ filename

    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
    

zapisz jako extract.sh i uruchom jako extract.sh myfile.tar. Zastąpi także wszelkie zduplikowane nazwy plików napotkane w katalogach pobranych z tarballa.


Właściwie właśnie przetestowałem to na jakimś drzewie katalogów w domu i nie działa na plikach zawierających spacje. Zobaczę, czy nie mogę opublikować aktualizacji.
DaveParillo,

Naprawiono to, ale nie jest tak ładne, jak było.
DaveParillo,

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

-OOpcja wypakowuje plik na standardowe wyjście i >przekierowania, że wyjście do pliku. Więc w moim przykładzie wypakowuję foo.mp3 i przekierowuję go do bar.mp3. Nazwy plików są dowolne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.