Pliki .tar bez struktury katalogów

32

Mam .tarkilka plików ze ścieżką example/super_user/Output.*.

Wynikowy .tarwygląda następująco:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Ale chcę, aby plik wyglądał następująco:

- Output.zip
- Output.xml
- Output.txt

Czy wiesz, jak mogę to osiągnąć, wciąż będąc w innym katalogu?

Der Hochstapler
źródło
Pamiętaj, aby unikać tarbombów z takimi archiwami.
grawity
tar --strip-components = 1000?
Zaar Hai

Odpowiedzi:

11

tar zachowa strukturę plików i folderów, więc nie sądzę, aby istniał sposób na instruowanie tar, aby spłaszczył hierarchię w czasie tworzenia.

Jednym z obejść jest tymczasowa zmiana katalogu, utworzenie tar, a następnie powrót - szybki przykład poniżej:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
Gafel
źródło
27

Jeśli katalog „example” znajduje się w katalogu głównym systemu plików, oto inny sposób:

tar -C /example/super_user -cvf result.tar .

spowoduje to zmianę katalogu do punktu, w którym chcesz wykonać tar. Zastrzeżenie polega na tym, że jeśli w katalogu / example / super_user są jakieś podkatalogi, struktura katalogów zostanie zachowana dla tych podkatalogów.

Anthony Walters
źródło
1
To jest odpowiedź na bieżący problem. Wspomniane zastrzeżenie nie stanowi w tym przypadku problemu. Wszystkie pozostałe odpowiedzi są obejściami uwzględniającymi różne warianty problemu.
joki
To rzeczywiście rozwiązanie tego pytania. Katalog nie musi być katalogiem głównym, zakładając strukturę katalogów /home/u/foo/bar, działa katalog /home/b, a następnie tar -C foo/bar -cvf qiz.tar .działa dobrze. Jedno zastrzeżenie jest jednak to, że nie można używać symboli wieloznacznych, tj tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"albo tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"nie będzie działać.
Brice,
1
Należy zauważyć, że możesz użyć -Cwiele razy w jednym tarpoleceniu, jeśli chcesz dodać wiele plików rozmieszczonych w wielu katalogach, ale nadal chcesz, aby plik tar był płaski.
zero298
10

Tutaj opublikowałem swoją odpowiedź:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

repost (dla leniwych ppl)


To brzydkie ... ale działa ...

Miałem ten sam problem, ale z wieloma folderami chciałem po prostu wyrównać wszystkie pliki. Możesz użyć opcji „transform”, aby przekazać wyrażenie sed i ... działa zgodnie z oczekiwaniami.

to jest wyrażenie:

's/.*\///g' (usuń wszystko przed „/”)

To jest ostatnie polecenie:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

Alessio Valentini
źródło
7

Aby utworzyć tar (ARCHIVE.tar) ze wszystkimi plikami z katalogu (DIR), bez żadnych informacji o katalogu nadrzędnym (nawet ./), możesz użyć czegoś takiego:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Możesz grać ze znalezieniem, aby ograniczyć głębokość, wybrać określone pliki i wiele innych rzeczy.

Powodzenia!

Paul Bhullar
źródło
Dostaję „find: -printf: nieznany główny lub operator” w komendzie OSX find. Jakieś wskazówki?
TCB13
-printfto niestandardowe polecenie. Wiele z nich działa tylko z określonymi wersjami find. Zazwyczaj zaznaczamy te, odpowiadając na pytanie o Super User (np „-blah jest rozszerzeniem GNU i nie będzie działać wszędzie”).
Hennes,
3

Utworzyłem katalog tymczasowy. A w katalogu utworzono dowiązania symboliczne do wszystkich plików do plików, które mają zostać uwzględnione. Potem zrobiłem tar -h -C. tak aby wszystkie pliki (nie linki, ale ich zawartość) były zawarte w archiwum o pożądanej nazwie.

mzwt
źródło
1

Jeśli jest to cała zawartość tarballa, możesz użyć --strip-componentsopcji tar GNU, aby usunąć 2 poziomy przed plikami.

Ignacio Vazquez-Abrams
źródło
Mam tylko opcję, --strip-pathale użycie jej niczego nie zmieni.
1

Innym sposobem na tymczasową zmianę katalogu jest umieszczenie poleceń cdi tarw nawiasach ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

Zaletą tego jest to, że po zakończeniu blokowania zawsze domyślnie wrócisz do oryginalnego katalogu. tzn. nie ma potrzeby pushd... popdblokowania lub śledzenia, gdzie cdwrócić.

Stephen Quan
źródło
0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd wypycha bieżącą ścieżkę katalogu do DIRstosu i przenosi do folderu zawartości. Następnie wróć do oryginalnego katalogu za pomocą popd.

Saravana Kumar
źródło