Jak tarować określone typy plików we wszystkich podkatalogach?

86

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?

user1566515
źródło

Odpowiedzi:

146

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -

DeeDee
źródło
@DeeDee Czy są jakieś ograniczenia dotyczące liczby plików itp.?
user1566515
1
@DeeDee - nie, chodziło mi o to, że nie potrzebujesz parenów!
Mike Makuch
@ user1566515 Może istnieć jakiś limit systemu plików lub ogólny limit miejsca, który nałoży górny limit na twój plik tar. To całkowicie zależy od twojego własnego systemu. W przeciwnym razie rurociąg zasadniczo utworzy plik tar w locie, więc nie będziesz ograniczany numerem ani rozmiarem pliku.
DeeDee,
Dzięki! ... jak dodać więcej niż 2 warunki / rodzaj pliku?
gluuke
5
@gluuke używać -o -name [pattern]dla każdego nowego stanu
DeeDee
15

Jeśli używasz bashwersji> 4.0, możesz wykorzystać, shopt -s globstaraby to zrobić:

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

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.

Sairam Krish
źródło
2
Jedyną odpowiedzią, która używa tylko tar, jest najlepsza odpowiedź IMO.
simon
2
Pomimo wrażenia przez glob '**' dla katalogu, to polecenie nie wykonuje rekurencyjnie (żadnych podfolderów)
Eddie
@Eddie ** powinno działać. może być coś innego z parametrami. Sprawdź również, czy w nazwie folderu jest wolne miejsce, które przekazujesz w wierszu poleceń. Jeśli nie, czy możesz wkleić swoje aktualne polecenie?
Sairam Krish
'**' jest sprawdzane przez powłokę przed dotarciem do polecenia i jest postrzegane tylko jako 2 niezależne *, które są rozwiązywane na 0 lub znaki, nie ma funkcji rekursywnej obejmującej katalogi tldp.org/LDP/GNU-Linux-Tools-Summary/ html / x11655.htm
Eddie
2
@eddie tak, jest oceniany przez powłokę, chociaż bash> 4.0 ma shopt -s globstaropcję, więc odpowiedź jest poprawna i jest właściwie najlepsza
Roman Usherenko
13

Jedna metoda to:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

Istnieją jednak pewne zastrzeżenia dotyczące tej metody:

  1. Nie powiedzie się, jeśli istnieją pliki lub katalogi ze spacjami, a
  2. zakończy się niepowodzeniem, jeśli jest tak wiele plików, że maksymalna długość wiersza poleceń jest pełna.

Aby obejść ten problem, można zapisać zawartość polecenia find do pliku, a następnie użyć opcji „-T, --files-from PLIK” do tar.

Robin Sheat
źródło
1) Przez „niepowodzenie” masz na myśli, że pliki ze spacjami zostaną pominięte lub archiwum tar nie zostanie utworzone? 2) Mam około 100K plików. Czy to przekracza maksymalną długość wiersza poleceń?
user1566515
1
1. Utworzy archiwum, ale zgłosi brakujące pliki. 2. Spodziewam się, że to potrwa zbyt długo. Biorąc to pod uwagę, najlepiej byłoby użyć metody takiej jak sugerowana poniżej @DeeDee, całkiem dobrze obejdzie te problemy.
Robin Sheat,
4

Spowoduje to obsługę ścieżek ze spacjami:

find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +
Ian Reinhart Geiser
źródło
0

Umieść je w pliku

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

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

tar cfh my.tar -I files.txt 
Noam Geffen
źródło
0

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

dmitry_podyachev
źródło
-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

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ń.

Trent Huang
źródło