Czy istnieje proste polecenie / skrypt powłoki, który obsługuje wykluczanie archiwizacji niektórych plików / folderów?
Mam katalog, który należy zarchiwizować, z podkatalogiem zawierającym wiele bardzo dużych plików, których nie muszę tworzyć kopii zapasowej.
Niezupełnie rozwiązania:
tar --exclude=PATTERN
Komenda pasuje do podanego wzorca i wyklucza te pliki, ale muszę określone pliki i foldery, które mają być ignorowane (pełna ścieżka do pliku), inaczej ważne pliki mogą być wykluczone.
Mógłbym również użyć polecenia find, aby utworzyć listę plików i wykluczyć te, których nie chcę archiwizować i przekazać listę do tar, ale działa to tylko z niewielką ilością plików. Mam dziesiątki tysięcy.
Zaczynam myśleć, że jedynym rozwiązaniem jest utworzenie pliku z listą plików / folderów, które mają zostać wykluczone, następnie użyj rsync z, --exclude-from=file
aby skopiować wszystkie pliki do katalogu tmp, a następnie użyj tar do zarchiwizowania tego katalogu.
Czy ktoś może wymyślić lepsze / bardziej wydajne rozwiązanie?
EDYCJA: Rozwiązanie Charlesa Ma działa dobrze. Duża gotcha polega na tym, że --exclude='./folder'
MUSI znajdować się na początku polecenia tar. Pełna komenda (najpierw cd, więc kopia zapasowa jest względna w stosunku do tego katalogu):
cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
--exclude
nie musi być pierwszy, ale musi przyjść gdzieś przed katalogiem źródłowym (testowane w Tar 1.29 na Cygwin).Odpowiedzi:
Możesz mieć wiele opcji wykluczania dla tar, więc
etc zadziała. Zrobić pewny postawić
--exclude
przed elementów źródłowych i docelowych.źródło
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
zwróć uwagę, że-f
flaga musi poprzedzać plik tar, patrz: superuser.com/a/559341/415047Możesz wykluczyć katalogi
--exclude
za pomocą tar.Jeśli chcesz zarchiwizować wszystko oprócz tego,
/usr
że możesz użyć:W twoim przypadku może coś takiego
źródło
Możliwe opcje wykluczania plików / katalogów z kopii zapasowej przy użyciu tar:
Wyklucz pliki przy użyciu wielu wzorców
Wyklucz pliki przy użyciu pliku wykluczenia wypełnionego listą wzorców
Wyklucz pliki przy użyciu znaczników, umieszczając plik znaczników w dowolnym katalogu, który należy pominąć
źródło
stare pytanie z wieloma odpowiedziami, ale okazało się, że żadne nie było dla mnie wystarczająco jasne, więc chciałbym dodać moją próbę.
jeśli masz następującą strukturę
z następującymi plikami / folderami
więc chcesz utworzyć plik tar, który zawiera wszystko w / home / ftp / mysite (aby przenieść stronę na nowy serwer), ale
file3
jest tylko śmieciami, a wszystko w nimfolder3
również nie jest potrzebne, więc pomińmy te dwa.używamy formatu
gdzie c = utwórz, z = zip, a v = pełne (możesz zobaczyć pliki w miarę ich wprowadzania, przydatne, aby upewnić się, że żaden z wykluczanych plików nie zostanie dodany). i f = plik.
więc moje polecenie wyglądałoby tak
zwróć uwagę, że wykluczone pliki / foldery odnoszą się do katalogu głównego twojej tar (próbowałem tutaj pełnej ścieżki w stosunku do /, ale nie mogę tego zrobić).
mam nadzieję, że to komuś pomoże (i mnie następnym razem google go)
źródło
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
, a to niczego nie wykluczało.Możesz użyć standardowej „notacji mrówek”, aby wykluczyć względne katalogi.
Działa to dla mnie i wyklucza wszystkie katalogi .git lub node_module:
myInputFile.txt zawiera:
/ dev2 / java
/ dev2 / javascript
źródło
globstar
. Sprawdź za pomocąshopt -s globstar
. Myślę, że jest to domyślnie wyłączone w większości systemów operacyjnych opartych na Uniksie. Z podręcznika Bash: „ globstar: Jeśli jest ustawiony, wzorzec**
użyty w kontekście rozszerzenia nazwy pliku będzie pasował do wszystkich plików i zero lub więcej katalogów i podkatalogów. Jeśli po wzorcu występuje„ / ”, pasują tylko katalogi i podkatalogi. ”Doświadczyłem tego, przynajmniej z wersją tar Cygwin, której używam („CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin” w systemie Windows XP Home Edition SP3), kolejność opcji jest ważna.
Podczas gdy ta konstrukcja działała dla mnie:
ten nie działał:
To
tar --help
ujawnia, co następuje:Drugie polecenie powinno również działać, ale najwyraźniej tak nie jest ...
Najlepsze rgds,
źródło
Wykluczenie wzorca obsługuje przyrostek nazw plików, takich jak png lub mp3, a także nazwy katalogów, takie jak .git i moduły_węzła
źródło
Dla tych, którzy mają z tym problemy, niektóre wersje tar działałyby poprawnie tylko bez „./” w wartości wykluczenia.
Składnia polecenia, która działa:
Te nie będą działać:
źródło
Znalazłem to gdzieś indziej, więc nie wezmę uznania, ale działało to lepiej niż którekolwiek z powyższych rozwiązań specyficznych dla mojego komputera Mac (nawet jeśli jest zamknięte):
źródło
COPYFILE_DISABLE=1
gdy używasz tar, w przeciwnym razie możesz dostać plikiW przypadku Mac OSX musiałem to zrobić
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Uwaga
-f
po--exclude=
źródło
Zgadzam się, że flaga --exclude jest właściwym podejściem.
Słowo ostrzeżenia dla efektu ubocznego, którego nie znalazłem od razu oczywiste: Wykluczenie „fileA” w tym przykładzie spowoduje wyszukanie „fileA” POWRÓT!
Przykład: katalog z pojedynczym podkatalogiem zawierający plik o tej samej nazwie (data.txt)
Jeśli korzystanie
--exclude='data.txt'
z archiwum nie będzie zawierało pliku EITHER data.txt. Może to powodować nieoczekiwane wyniki podczas archiwizowania bibliotek stron trzecich, takich jak katalog node_modules.Aby uniknąć tego problemu, podaj całą ścieżkę, np
--exclude='./dirA/data.txt'
źródło
Aby uniknąć możliwych
'xargs: Argument list too long'
błędów spowodowanych użyciemfind ... | xargs ...
podczas przetwarzania dziesiątek tysięcy plików, możeszfind
bezpośrednio przesyłać dane wyjściowe dotar
użyciafind ... -print0 | tar --null ...
.źródło
xargs -n 1
to kolejna opcja na uniknięciexargs: Argument list too long
błędu;)Po przeczytaniu tego wątku zrobiłem małe testy na RHEL 5 i oto moje wyniki dla tarowania katalogu abc:
Wyklucza to błąd katalogów i dzienników oraz wszystkich plików w katalogach:
Dodanie symbolu wieloznacznego po wykluczonym katalogu spowoduje wykluczenie plików, ale zachowanie katalogów:
źródło
Użyj polecenia find w połączeniu z opcją tar append (-r). W ten sposób możesz dodawać pliki do istniejącej tar w jednym kroku, zamiast rozwiązania dwuprzebiegowego (utwórz listę plików, utwórz tar).
źródło
Możesz także użyć jednej z opcji „--exclude-tag” w zależności od potrzeb:
Folder obsługujący określony PLIK zostanie wykluczony.
źródło
Po przeczytaniu wszystkich tych dobrych odpowiedzi dla różnych wersji i rozwiązaniu problemu dla siebie, myślę, że są bardzo małe szczegóły, które są bardzo ważne i rzadkie dla ogólnego użytku GNU / Linux , które nie są wystarczająco zestresowane i zasługują na więcej niż komentarze.
Więc nie zamierzam odpowiadać na pytanie dla każdej sprawy, ale zamiast tego postaram się zarejestrować, gdzie szukać gdy coś nie działa.
BARDZO WAŻNE jest, aby POWIADOMIĆ:
W moim przypadku dla GNU tar 1.29 na odcinku Debian działało polecenie
Cytaty nie miały znaczenia, działały z nimi lub bez nich.
Mam nadzieję, że to komuś się przyda.
źródło
Możesz użyć cpio (1), aby utworzyć pliki tar. cpio zabiera pliki do archiwizacji na standardowym interfejsie, więc jeśli już zorientowałeś się w komendzie find, której chcesz użyć do wybrania plików archiwum, potokuj go do cpio, aby utworzyć plik tar:
źródło
gnu tar v 1.26 argument --exclude musi występować po argumentach pliku archiwum i katalogu kopii zapasowej, nie powinien zawierać początkowych ani końcowych ukośników i nie preferuje cudzysłowów (pojedynczych lub podwójnych). W stosunku do katalogu PARENT, którego kopię zapasową chcesz utworzyć, jest to:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
źródło
tar (GNU tar) 1.28
.-X oznacza plik zawierający listę nazw plików, które należy wykluczyć z kopii zapasowej. Na przykład możesz podać * ~ w tym pliku, aby nie uwzględniać w kopii zapasowej żadnych nazw plików kończących się na ~.
źródło
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Najlepiej jest użyć find z tar, za pomocą xargs (do obsługi dużej liczby argumentów). Na przykład:
źródło
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
należy użyćr
opcji tar zamiast,c
ponieważ gdyfind
faktycznie znajdzie mnóstwo wyników, xargs podzieli te wyniki (w oparciu o limit argumentów lokalnego wiersza poleceń) na chuncks i wywoła tar z każdej części. Spowoduje to utworzenie archiwum zawierającego ostatni zwrócony fragmentxargs
i nie wszystkie wyniki znalezione przezfind
polecenie.Możliwa redundantna odpowiedź, ale ponieważ uznałem ją za przydatną, oto ona:
Będąc rootem FreeBSD (tj. Używając csh), chciałem skopiować cały główny system plików do / mnt, ale bez / usr i (oczywiście) / mnt. Oto, co zadziałało (jestem w /):
Chodzi mi o to, że konieczne było (poprzez wstawienie ./ ), aby sprecyzować, że wykluczone katalogi będą kopiowane.
Moje 0,02 €
źródło
Nie miałem szczęścia, że tar wyłączyłby podkatalog 5 gigabajtów na kilka poziomów głębokości. W końcu właśnie użyłem uniksowego polecenia Zip. Dla mnie to działało o wiele łatwiej.
Więc dla tego konkretnego przykładu z oryginalnego postu
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)
Odpowiednikiem byłoby:
(UWAGA: Oto post, którego pierwotnie użyłem, który pomógł mi /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )
źródło
zip
nie pakuje pustych katalogów, aletar
robi to!Sprawdź to
źródło
Chcę mieć świeżą wersję frontonu (folder kątowy) na localhost. Ponadto folder git jest w moim przypadku ogromny i chcę go wykluczyć. Muszę pobrać go z serwera i rozpakować, aby uruchomić aplikację.
Skompresuj folder kątowy z / var / lib / tomcat7 / webapps, przenieś go do folderu / tmp o nazwie angular.23.12.19.tar.gz
Komenda :
źródło
Sukces: 1) jeśli podając pełną ścieżkę do wykonania kopii zapasowej, należy wykluczyć również pełną ścieżkę.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC
2) jeśli podając bieżącą ścieżkę do wykonania kopii zapasowej, w wykluczeniu należy również użyć tylko bieżącej ścieżki.
tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC
Przypadek awarii:
jeśli podając katalog currentpath do wykonania kopii zapasowej i pełną ścieżkę do zignorowania, to nie będzie działać
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC
Uwaga: wspomnienie wykluczenia przed / po katalogu kopii zapasowej jest w porządku.
źródło
Jeśli próbujesz wykluczyć pliki Systemu kontroli wersji (VCS), tar obsługuje już dwie interesujące opcje! :)
Wyklucza to opcja plików i katalogów wykorzystywane przez następujące systemy kontroli wersji:
CVS
,RCS
,SCCS
,SVN
,Arch
,Bazaar
,Mercurial
, iDarcs
.Począwszy od wersji 1.32, następujące pliki są wykluczone:
CVS/
i wszystko pod tymRCS/
i wszystko pod tymSCCS/
i wszystko pod tym.git/
i wszystko pod tym.gitignore
.gitmodules
.gitattributes
.cvsignore
.svn/
i wszystko pod tym.arch-ids/
i wszystko pod tym{arch}/
i wszystko pod tym=RELEASE-ID
=meta-update
=update
.bzr
.bzrignore
.bzrtags
.hg
.hgignore
.hgrags
_darcs
Podczas archiwizacji katalogi, które są pod jakimś systemem kontroli wersji (VCS), często jest to wygodne, aby czytać wzorce wykluczeń z tego VCS”ignorować pliki (np
.cvsignore
,.gitignore
itp) Ta opcja zapewnić taką możliwość.Przed archiwizacji katalogu, czy zawiera jeden z następujących plików:
cvsignore
,.gitignore
,.bzrignore
, lub.hgignore
. Jeśli tak, przeczytaj ignoruj wzorce z tych plików.Wzorce są traktowane tak samo, jak odpowiadałby im odpowiedni VCS, tj .:
.cvsignore
Zawiera wzorce globowania w stylu powłoki, które dotyczą tylko katalogu, w którym znajduje się ten plik. Plik nie zawiera komentarzy. Puste linie są ignorowane.
.gitignore
Zawiera wzory globowania w stylu muszli. Dotyczy katalogu, w którym się
.gitfile
znajduje i wszystkich jego podkatalogów.Każda linia rozpoczynająca się od a
#
jest komentarzem. Ukośnik odwraca znak komentarza..bzrignore
Zawiera wzorce globowania powłoki i wyrażenia regularne (jeśli są poprzedzone przez
RE:
(16). Wzory wpływają na katalog i wszystkie jego podkatalogi.Każda linia rozpoczynająca się od a
#
jest komentarzem..hgignore
Zawiera posixowe wyrażenia regularne (17). Linia
syntax: glob
przełącza się na wzorce globowania powłoki. Liniasyntax: regexp
przełącza się z powrotem. Komentarze zaczynają się od#
. Wzorce wpływają na katalog i wszystkie jego podkatalogi.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
źródło
Poniższy skrypt bash powinien załatwić sprawę. Wykorzystuje odpowiedź podaną tutaj przez Marcusa Sundmana.
Spowoduje to wydrukowanie potrzebnego polecenia i możesz go po prostu skopiować i wkleić z powrotem. Prawdopodobnie istnieje bardziej elegancki sposób na dostarczenie go bezpośrednio do wiersza poleceń.
Wystarczy zmienić * .CC dla dowolnego innego wspólnego rozszerzenia, nazwy pliku lub wyrażenia regularnego, które chcesz wykluczyć, a to powinno nadal działać.
EDYTOWAĆ
Wystarczy dodać małe wyjaśnienie; find generuje listę plików pasujących do wybranego wyrażenia regularnego (w tym przypadku * .CC). Ta lista jest przekazywana przez polecenie xargs do polecenia echo. Zostanie wydrukowane - wyklucz „jeden wpis z listy”. Ukośniki () to znaki specjalne dla znaków „.
źródło