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?

Benji XVI
źródło
Powiązane: Wyodrębnianie zawartości archiwum tar do katalogu nadrzędnego .
G-Man mówi „Przywróć Monikę”

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ę.

Mario
źródło
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
MikeyB
źródło
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ę.

hfs
źródło
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.

DaveParillo
źródło
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.

Klaatu von Schlacker
źródło