Załóżmy, że mam skompresowany przez gzip plik tar-ball CompressedArchive.tgz (+100 plików, łącznie + 5 gb).
Jaki byłby najszybszy sposób, aby usunąć wszystkie wpisy pasujące do wzorca nazwy pliku, na przykład przedrostek * .jpg, a następnie zapisać resztki w gzip: ed tar-ball?
Zastąpienie starego archiwum lub utworzenie nowego nie jest ważne, w zależności od tego, co nastąpi najszybciej.
Odpowiedzi:
Dzięki GNU
tar
możesz:Z
bsdtar
:(
pigz
będąca wersją wielowątkowągzip
).Możesz nadpisać sam plik, tak jak:
Jest to jednak dość ryzykowne, zwłaszcza jeśli wynik jest mniej skompresowany niż oryginalny plik (w takim przypadku drugi
pigz
może ostatecznie zastąpić obszary pliku, których pierwszy jeszcze nie przeczytał).źródło
Nie dyskontuj w prosty sposób: może być wystarczająco szybki dla twojego celu. Z avfs, aby uzyskać dostęp do archiwum jako katalogu:
Korzystając z bardziej prymitywnych narzędzi, najpierw wyodrębnij pliki z wyłączeniem
.jpg
plików, a następnie utwórz nowe archiwum.Jeśli twoja smoła ma
--exclude
:Może to jednak zaburzać własność i tryby plików, jeśli nie uruchomisz go jako root. Aby uzyskać najlepsze wyniki, użyj katalogu tymczasowego w szybkim systemie plików - tmpfs, jeśli masz wystarczająco duży.
Wsparcie dla archiwizatorów działających jako tranzyt (tj. Czytaj archiwum i zapisuj archiwum) jest zwykle ograniczone. GNU tar może usuwać członków z archiwum za pomocą
--delete
opcji operacji („Zgłoszono, że--delete
opcja działa poprawnie, gdytar
działa jak filtr odstdin
dostdout
.”), I to prawdopodobnie najlepsza opcja.Możesz stworzyć potężne filtry archiwalne w kilku wierszach Pythona. Jego
tarfile
biblioteka może odczytywać i zapisywać z niewidocznych strumieni, a także można używać dowolnego kodu w Pythonie do filtrowania, zmieniania nazw, modyfikowania…źródło
tar
możesz dodaćp
opcję.Dzięki tarowi dostępnemu w Mac OSX możesz to zrobić:
źródło
Aby to zrobić, prawdopodobnie musisz wyodrębnić całą zawartość pliku .tgz w lokalnym katalogu, a następnie usunąć niepotrzebne pliki, a następnie ponownie skompresować plik .tgz.
Jest długi i potrzebujesz wystarczającej ilości wolnego miejsca na dysku, ale o ile mi wiadomo, nie ma innego sposobu, aby to zrobić.
Ponieważ masz już taką ścieżkę z
/tmpdir/withalotofspace
wystarczającą ilością wolnego miejsca (sprawdź to za pomocądf -h /tmpdir/withalotofspace
), możesz zrobić coś takiego:źródło
Podoba mi się odpowiedź @Gilles, ale można ją jeszcze bardziej uprościć. Na przykład po rozpakowaniu
gunzip foo.tgz
plik będziefoo.tar
i pliki można usunąć za pomocątar -f foo.tar --delete file|directory
. Poniżej znajduje się przykład usuwania katalogu z pliku tar.Określone typy plików można znaleźć za pomocą
tar -tf foo.tar|egrep -i '.jpg$'
.źródło