Próbuję utworzyć skompresowany plik tar, który zawiera wszystkie pliki PDF, które istnieją w jednym z moich katalogów. Struktura katalogu musi zostać zachowana. Puste katalogi nie są potrzebne, ale tak naprawdę nie obchodzi mnie, czy tam są.
Załóżmy na przykład, że miałem katalog, który wyglądał tak:
dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf
Po uruchomieniu polecenia chciałbym mieć dir.tar.gz
to:
dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf
Możliwy?
find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
\'"
(błąd xargs) i nie będzie działać, jeśli jest zbyt wiele nazw plików (błąd jądra).-printf '"%p"\n'
część się tym zajmuje (przynajmniej dla mnie).Z bash ≥4 lub zsh i GNU tar:
Może to nie działać, jeśli masz bardzo dużą liczbę plików PDF, a linia poleceń jest zbyt długa. Wtedy potrzebujesz bardziej złożonego rozwiązania opartego na wyszukiwaniu (ponownie, używając GNU tar):
Alternatywnie (i przenośnie) możesz utworzyć archiwum za pomocą pax .
Pierwszy
-s
mówi, aby uwzględnić wszystkie.pdf
pliki bez zmiany ich nazwy. Drugi-s
mówi o zmianie nazwy wszystkich innych plików na pustą nazwę, co w rzeczywistości oznacza, że nie należy uwzględniać ich w archiwum.źródło
**
; Nawet nie zdawałem sobie sprawy, że bash 4 miał to teraz