2009-07-10 5 views
31

Utknąłem na małym problemie z wierszem poleceń uniksa.Jak skompresować całe drzewo folderów w systemie Unix, ale tylko niektóre pliki?

Mam folder witryny (4gb) Potrzebuję pobrać kopię, ale tylko pliki .php, .html, .js i .css (co jest tylko kilkaset kb).

Myślę, że najlepiej jest skompresować lub zarchiwizować cały folder, ale tylko chwytając określone rozszerzenia plików, zachowując jednocześnie struktury podfolderów. Czy to możliwe, a jeśli tak, to w jaki sposób?

Próbowałem zrobić cały zamek błyskawiczny, a następnie przeglądać i wykluczać niektóre pliki, ale wydawało się to nieco przesadzone.

Jestem trochę nowa w systemie unix.

Wszelkie pomysły będą mile widziane.

+4

Można uzyskać lepsze rezultaty, jeśli poprosisz to na serverfault.com (stronę konkretnego sysadmin) –

Odpowiedz

38

przełącznik do folderu na stronie, a następnie uruchomić

zip -R foo '*.php' '*.html' '*.js' '*.css' 

Można również uruchomić ten spoza katalogu strony:

zip -r foo website_folder -i '*.php' '*.html' '*.js' '*.css' 
+0

Nie znajdzie pasujące pliki w podkatalogach. –

+2

na stronie zip, musisz podać argumenty za pomocą pojedynczych cudzysłowów ... w przeciwnym razie podejrzewam, że pocisk rozwinie je, zanim przejdzie na zip – kdgregory

+0

W rzeczywistości to zrobi. -R flag –

1

Można napisać skrypt powłoki, aby skopiować pliki na podstawie wzorca/wyrażenia do nowego folderu, rozpakować zawartość, a następnie usunąć folder. Teraz, jeśli chodzi o faktyczną składnię, źle ci to pozostawiam: D.

+1

Copy 4GB danych? Myślę, że powinno to zostać wykorzystane jako ostatni raport. – MitMaro

+0

Nie skopiowałbyś całego katalogu - tylko pliki pasujące do wzorca. W ten sposób, gdy utworzysz zip, możesz po prostu napisać zip all, a następnie usunąć. – barfoon

+1

@MitMaro OP mówi, że to tylko kilka godzin KiB ... w każdym razie, ulepszona wersja mogłaby być zrobiona po prostu linki linki zamiast kopiowania (jeśli dowiązania symboliczne, to użyj -h z tar) ...w ten sposób można ponownie wykorzystać widok tego folderu w celu dalszego tworzenia kopii zapasowych :-) – fortran

14

można wykorzystywać find i grep do generowania listy plików, a rura, która w zip

np

find . | egrep "\.(html|css|js|php)$" | zip [email protected] test.zip 

([email protected] mówi zip odczytać listę plików z stdin)

+4

Jeśli masz dużą liczbę niepasujących plików, byłoby nieco bardziej wydajnie zrobić coś takiego jak "znajdź". -iname \ *. html -o -iname \ *. css -o -iname \ *. js -o -iname \ *. php' zamiast 'find. | grep ... '. –

3

może chcesz użyć znaleźć (GNU), aby znaleźć wszystkie swoje php, html itp files.then smoła je

find /path -type f \(-iname "*.php" -o -iname "*.css" -o -iname "*.js" -o -iname "*.ext" \) -exec tar -r --file=test.tar "{}" +; 

po tym można zip go

+2

Problem z tym podejściem polega na tym, że będzie on działał dla każdego pliku tak – kdgregory

+1

tak to robi. lepszym sposobem jest użycie zip -R, jak opublikował jeden z was. – ghostdog74

7

W ten sposób udało mi się to zrobić, ale lubię też wersji ghostdog74 męska.

tar -czvf archive.tgz `find test/ | egrep ".*\.html|.*\.php"` 

Możesz dodać dodatkowe rozszerzenia, dodając je do wyrażenia regularnego.

+1

możesz napotkać problemy z rozmiarem listy argumentów - zobacz xargs – kdgregory

4

Podobała mi się odpowiedź Nicka, ale ponieważ jest to strona programistyczna, dlaczego nie skorzystać z Anta, aby to zrobić. :)

Następnie można ustawić parametr, aby różne typy plików mogły być spakowane.

http://ant.apache.org/manual/Tasks/zip.html

+1

Znalazłem mrówkę przydatną, a dokumentacja jest dość łatwa do naśladowania. –

Powiązane problemy