Rozważ pojedynczy plik tar z zewnętrznego systemu, który zawiera niektóre katalogi z różnymi atrybutami, które chcę zachować, takie jak uprawnienia, czasy itp. Jak mogę łatwo wziąć podzbiór tych plików jako zwykły użytkownik (nie root)?
Szukasz czegoś takiego:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
Ważne jest również, aby zachować główne atrybuty (własność, grupa, tryb, mtime) w tym archiwum tar. Co z innymi atrybutami w pliku tar, takimi jak słowa kluczowe z rozszerzonym nagłówkiem ?
Punkty bonusowe za rozwiązanie, które pozwala uniknąć korzystania z katalogu tymczasowego na wypadek, gdyby ten podkatalog zawierał ogromne pliki.
@original.tar
podejście jest możliwe dzięki bsdtar. Wydaje się, że działa również z rozszerzonymi atrybutami i kompresją</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(i z jakiegoś powodu pusty wybór generuje serię zerowych bajtów, ale to nie jest dla mnie poważny problem).s/old/new/
nie działa na plikach pochodzących ze starych archiwów przy użyciu @ old.tgz, działa tylko na prawdziwych plikach, archiwizując bezpośrednio z systemu plików. Szkoda, bo byłby to dla mnie najbardziej przydatny przypadek użycia.Najprostszym sposobem byłoby skopiowanie całego archiwum; Zakładam, że nie chcesz tego robić, ponieważ jest za duży.
Zwykłe narzędzia wiersza poleceń (
tar
,pax
) nie obsługują kopiowania członków archiwum do innego archiwum.Jeśli nie musiałeś zachowywać własności, sugerowałbym użycie systemów plików FUSE . Możesz użyć archivemount do zamontowania archiwum jako systemu plików; zrób to dla archiwum źródłowego i uruchom tar na zamontowanym systemie plików.
Alternatywnie możesz użyć AVFS :
Alternatywnie możesz uruchomić
tar
oryginalne archiwum i rozpakować je na zdalnym komputerze za pośrednictwem SSHFS .Jednak wszystkie te metody są uciążliwe, jeśli chcesz zachować własność. Wszystkie wymagają wypakowania do pliku na komputerze lokalnym, więc właścicielem tego pliku będzie musiała być zamierzona własność zdalna . Wymaga to działania jako root i może nie przynieść zamierzonego rezultatu, jeśli pliki są własnością kont o nazwach lub identyfikatorach różniących się między komputerem lokalnym a hostem zdalnym.
tarfile
Biblioteka Pythona zapewnia dość łatwy sposób manipulowania elementami tar, dzięki czemu można je przetasować z jednego pliku tar do drugiego. Obsługuje standardowe formaty POSIX (ustar, pax), a także niektóre rozszerzenia GNU. Oto nieprzetestowany skrypt Pythona, który odczytuje plik tar (ewentualnie skompresowany za pomocą gzip lub bzip2) na standardowym wejściu i zapisuje plik tar skompresowany za pomocą bzip2 na standardowym wyjściu. Członkowie ze źródła są kopiowani, jeśli zaczynają od argumentu przekazanego do skryptu.Być wywoływanym jako
źródło
Alternatywnym podejściem bez przywilejów jest użycie
fakeroot
programu do udawania, że możesz zmienić własność. Podczas gdy inne atrybuty tar są tracone, zachowuje tryb, mtime i uid / gid. Te polecenia tworzą katalog tymczasowy, wyodrębniają podzbiór plików i na koniec tworzą nowe archiwum:źródło
GNU
tar
ma--delete
opcję:W ten sposób można uzyskać podzbiór tar wejściowej, określając, co nie ma być uwzględniane w danych wyjściowych.
Niestety nie mogłem uzyskać
--exclude
opcji do pracy--delete
, więc wydaje się, że najpierw musisz uzyskać jawną listę (-t
) rzeczy do usunięcia, a następnie przekazać ją do innego wywołaniatar
.Lub możesz zapisać listę w pliku zewnętrznym, jeśli jest zbyt długi lub złożony:
źródło
Z tego co wiem,
tar
polecenie nie może używać formatu tar zarówno jako danych wejściowych, jak i wyjściowych. Będziesz musiał jakoś wyodrębnić pliki lokalnie i ponownie użyć tar, aby utworzyć plik tar w locie, z czymś takim (-
oznacza to, że zamiast pliku używane jest standardowe wejście / wyjście):Pamiętaj,
tar
że możliwość wyodrębnienia pliku tar bezpośrednio z innego pliku tar jest ciekawym pomysłem ...źródło