Chcę tarować i wszystkie pliki .php i .html w katalogu i jego podkatalogach. Jeśli używam
tar -cf my_archive *
niszczy wszystkie pliki, których nie chcę. Jeśli używam
tar -cf my_archive *.php *.html
ignoruje podkatalogi. Jak mogę sprawić, by tar był rekurencyjnie, ale zawierał tylko dwa typy plików?
-o -name [pattern]
dla każdego nowego stanuJeśli używasz
bash
wersji> 4.0, możesz wykorzystać,shopt -s globstar
aby to zrobić:spowoduje to dodanie wszystkich plików .yml zaczynających się od Alice z dowolnego podkatalogu i dodanie wszystkich plików .json rozpoczynających się od Bob z dowolnego podkatalogu.
źródło
shopt -s globstar
opcję, więc odpowiedź jest poprawna i jest właściwie najlepszaJedna metoda to:
Istnieją jednak pewne zastrzeżenia dotyczące tej metody:
Aby obejść ten problem, można zapisać zawartość polecenia find do pliku, a następnie użyć opcji „-T, --files-from PLIK” do tar.
źródło
Spowoduje to obsługę ścieżek ze spacjami:
źródło
Umieść je w pliku
Następnie użyj tego pliku jako danych wejściowych do tar, użyj -I lub -T w zależności od używanej wersji tar
Użyj h, aby skopiować dowiązania symboliczne
źródło
find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz
dla wielu rdzeni lub tylko dla jednego rdzenia:
find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz
źródło
Użyj poleceń „find” i „grep”, aby uzyskać wszystkie ścieżki plików .php i .html w całym katalogu i jego podkatalogach. Następnie przekaż te informacje o ścieżce do programu tar w celu skompresowania.
Proszę uważać na te symbole `i '. Zwróć również uwagę, że w przeciwieństwie do niektórych innych odpowiedzi osiągnie to limit liczby znaków, na które Twoja powłoka pozwoli w wierszu poleceń.
źródło