Polecenie powłoki do katalogu tar z wyłączeniem niektórych plików / folderów

810

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=PATTERNKomenda 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=fileaby 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 .
głęboka studnia
źródło
120
Przydała mi się inna rzecz, która może być warta odnotowania: końcowe ukośniki na końcu wykluczonych folderów spowodują, że tar w ogóle ich nie wyklucza.
Rekhyt
7
@Rekhyt dzięki, gapiłem się na komendę przez 15 minut ... potem 30
kamera douszna
9
Wygląda na to, że pozycja --exclude zależy od wersji tar. W przypadku tar 1.23, po poleceniach głównych musi pojawić się --exclude.
Joel G. Mathew
2
Nie zapomnij o „” (cudzysłowie).
Meetai.com,
3
--excludenie musi być pierwszy, ale musi przyjść gdzieś przed katalogiem źródłowym (testowane w Tar 1.29 na Cygwin).
wortwart

Odpowiedzi:

1038

Możesz mieć wiele opcji wykluczania dla tar, więc

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

etc zadziała. Zrobić pewny postawić --exclude przed elementów źródłowych i docelowych.

Charles Ma
źródło
78
Ta odpowiedź sprawia, że ​​wygląda na to, że - najpierw jest wykluczone ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien
13
Na przykład, jeśli próbujesz wykonać kopię zapasową folderu projektu wordpress, wyłączając folder uploads, możesz użyć tego polecenia: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth
12
Wymyśliłem następujące polecenie: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . zwróć uwagę, że -fflaga musi poprzedzać plik tar, patrz: superuser.com/a/559341/415047
Alfred Bez
21
Znak „/” na końcu katalogu wykluczenia spowoduje jego awarię. Myślę, że tar uważa, że ​​końcówka / jest częścią nazwy katalogu do wykluczenia. ZŁE: --exclude = mójkir / DOBRY: --exclude = mójdir
Josiah
4
> Pamiętaj, aby umieścić --exclude przed elementami źródłowymi i docelowymi. LUB użyj bezwzględnej ścieżki wykluczenia: tar -cvpzf backups / target.tar.gz --exclude = '/ home / username / backups' / home / username
NightKnight on Cloudinsidr.com 24.11.16
131

Możesz wykluczyć katalogi --excludeza pomocą tar.

Jeśli chcesz zarchiwizować wszystko oprócz tego, /usrże możesz użyć:

tar -zcvf /all.tgz / --exclude=/usr

W twoim przypadku może coś takiego

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Johan Soderberg
źródło
17
Aby to wyjaśnić, możesz użyć pełnej ścieżki dla --exclude.
Johan Soderberg
2
w niektórych przypadkach wymagane jest
wykluczenie
68

Możliwe opcje wykluczania plików / katalogów z kopii zapasowej przy użyciu tar:

Wyklucz pliki przy użyciu wielu wzorców

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Wyklucz pliki przy użyciu pliku wykluczenia wypełnionego listą wzorców

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Wyklucz pliki przy użyciu znaczników, umieszczając plik znaczników w dowolnym katalogu, który należy pominąć

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Stephen Donecker
źródło
3
Kolejność parametrów wydaje się mieć znaczenie i ta forma działa dla mnie.
cstamas
1
Ja też. W przypadku tar (GNU tar) 1.28 na Ubuntu 16.04 działała tylko ta konkretna kolejność parametrów.
alvaroreig,
43

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ę

/home/ftp/mysite/

z następującymi plikami / folderami

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

więc chcesz utworzyć plik tar, który zawiera wszystko w / home / ftp / mysite (aby przenieść stronę na nowy serwer), ale file3jest tylko śmieciami, a wszystko w nim folder3również nie jest potrzebne, więc pomińmy te dwa.

używamy formatu

tar -czvf <name of tar file> <what to tar> <any excludes>

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

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

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)

Sverre
źródło
6
Ta odpowiedź zdecydowanie mi pomogła! Dla mnie gotcha polegała na tym, że moje polecenie wyglądało podobnie tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', a to niczego nie wykluczało.
Anish Ramaswamy
2
Twoja próbka była bardzo podobna do tego, z czym miałem problem! Dziękuję Ci!
Qorbani,
2
Ładnie i wyraźnie dziękuję. Dla mnie problemem było to, że inne odpowiedzi zawierają absolutne ścieżki względne. Ale wszystko, co musisz zrobić, to dodać nazwę folderu, który chcesz wykluczyć.
Hubert
2
To jest o wiele bardziej jednoznaczna odpowiedź. Dzięki temu przykładowi udało mi się go uruchomić, ponieważ ścieżki na początku były mylące. Wielkie dzięki!
fagiani
2
zadziałało! Pamiętaj, aby nie dodawać końcowego ukośnika do wykluczenia. Na przykład, podczas gdy „plik3” lub „plik3 / podfolder” działa, „plik3 /” i „plik3 / podfolder /” nie działają!
lucaferrario,
24

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:

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt zawiera:

/ dev2 / java
/ dev2 / javascript

Eric Manley
źródło
4
Uważam, że wymaga to włączenia zmiennej opcji powłoki Bash 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.
not2qubit
15

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:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

ten nie działał:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

To tar --helpujawnia, co następuje:

tar [OPTION...] [FILE]

Drugie polecenie powinno również działać, ale najwyraźniej tak nie jest ...

Najlepsze rgds,

GeertVc
źródło
5
Po prostu chcę dodać do powyższego, że ważne jest, aby wykluczony katalog NIE zawierał końcowego odwrotnego ukośnika. Tak więc, --exclude = '/ path / to / exclude / dir' jest CORRECT , --exclude = '/ path / to / exclude / dir /' jest nieprawidłowy .
GeertVc,
17
dzieje się tak, ponieważ docelowe archiwum target.tgz jest argumentem przełącznika f, którym powinien podążać
Valentino
14

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

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Scott Stensland
źródło
dzięki - tego właśnie szukałem :)
Alexander Br.
11

Dla tych, którzy mają z tym problemy, niektóre wersje tar działałyby poprawnie tylko bez „./” w wartości wykluczenia.

Tar --version

tar (GNU tar) 1.27.1

Składnia polecenia, która działa:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Te nie będą działać:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
J. Lawson
źródło
10

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):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Obrabować
źródło
2
Dzięki za tę odpowiedź, tar na Darwin zdecydowanie ma inną składnię i doprowadzało mnie do szału, dlaczego „--exclude = bla” w innych odpowiedziach nie działało. Działa to świetnie na komputerze Mac.
Michael
1
Nie zapomnij, COPYFILE_DISABLE=1gdy używasz tar, w przeciwnym razie możesz dostać pliki
._
Dziękujemy za podanie odpowiedzi. Zawsze miło jest dołączyć link do źródła, w którym znalazłeś odpowiedź. Premia: jeśli źródło pochodzi z innego stosu przepływu lub wymiany stosów, otrzymasz dodatkową karmę (punkty lub odznaki - nie pamiętam, które). Tak czy inaczej, uśmiechają się i wszyscy wygrywają. Bez wad :-) Pomaga także ludziom, którzy chcą wyszukać dodatkowe informacje. Czasami ludzie będą głosować tylko dlatego, że podałeś link źródłowy. Wreszcie, dzieląc się konkretnym problemem, który został rozwiązany, lub dlaczego było to lepsze rozwiązanie, może pomóc komuś innemu z unikalnym problemem.
SherylHohman
8

W przypadku Mac OSX musiałem to zrobić

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Uwaga -fpo--exclude=

Jerinaw
źródło
6

Zgadzam się, że flaga --exclude jest właściwym podejściem.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

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)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • 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'

Aaron Votre
źródło
5

Aby uniknąć możliwych 'xargs: Argument list too long'błędów spowodowanych użyciem find ... | xargs ...podczas przetwarzania dziesiątek tysięcy plików, możesz findbezpośrednio przesyłać dane wyjściowe do tarużycia find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
Carlo
źródło
możesz zacytować ciąg „wyklucz”, na przykład: „somedir / filesdir / *”, wówczas powłoka nie będzie rozwijała gwiazdek i innych białych znaków.
Znik
xargs -n 1to kolejna opcja na uniknięcie xargs: Argument list too longbłędu;)
Tuxdude
5

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:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

Dodanie symbolu wieloznacznego po wykluczonym katalogu spowoduje wykluczenie plików, ale zachowanie katalogów:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Mikrofon
źródło
W drugim przykładzie powyżej po ostatnim ukośniku w każdej klauzuli wykluczającej powinny znajdować się gwiazdki, ale post ich nie wziął.
Mike
4

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

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
Alex B.
źródło
4

Możesz także użyć jednej z opcji „--exclude-tag” w zależności od potrzeb:

  • --exclude-tag = PLIK
  • --exclude-tag-all = PLIK
  • --exclude-tag-under = PLIK

Folder obsługujący określony PLIK zostanie wykluczony.

frommelmak
źródło
4

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Ć:

  1. ZAMÓWIENIE OPCJI MAJĄ: to nie to samo, że wstaw opcję --exclude wcześniej niż po opcji pliku i katalogach do utworzenia kopii zapasowej. Jest to dla mnie nieoczekiwane, ponieważ z mojego doświadczenia wynika, że ​​w poleceniach GNU / Linux zwykle kolejność opcji nie ma znaczenia.
  2. Różne wersje tar oczekują tych opcji w różnej kolejności: na przykład odpowiedź @ Andrew wskazuje, że w GNU tar v 1.26 i 1.28 wykluczenia są ostatnie, podczas gdy w moim przypadku, z GNU tar 1.29, jest na odwrót.
  3. CIĘŻAROWE CIĘCIA SIĘ LICZĄ : przynajmniej w GNU tar 1.29 nie powinno być żadnych .

W moim przypadku dla GNU tar 1.29 na odcinku Debian działało polecenie

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

Cytaty nie miały znaczenia, działały z nimi lub bez nich.

Mam nadzieję, że to komuś się przyda.

użytkownik2553863
źródło
Dziękuję za Twoją odpowiedź. Szukałem (co wydawało mi się bardzo długo) rozwiązania, a twoja odpowiedź poprowadziła mnie we właściwym kierunku. Jednak w moim przypadku (Ubuntu 18.04.3, Tar 1.29) mogłem tylko sprawić, by działało z dodaniem nazwy folderu, a NIE ścieżki, np .: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. folder tgz
Nitai
2

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:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
camh
źródło
2

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

Andrzej
źródło
Po wielu eksperymentach znalazłem mniej więcej to samo z moim dowództwem tar (GNU tar) 1.28.
PicoutputCls,
2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

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

Ashwini Gupta
źródło
Myślę, że to najlepsze rozwiązanie, ponieważ działa nawet w tych przypadkach, że liczba wykluczeń jest duża. Możliwe jest również włączenie opcji X do pakietu opcji, więc najkrótsza forma to prawdopodobnie:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke
0

Najlepiej jest użyć find z tar, za pomocą xargs (do obsługi dużej liczby argumentów). Na przykład:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Joe
źródło
4
Może to powodować wielokrotne wywoływanie tar - a także będzie spakować pliki wielokrotnie. Prawidłowe jest:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen
Czytałem gdzieś, że przy użyciu xargsnależy użyć ropcji tar zamiast, cponieważ gdy findfaktycznie 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 fragment xargsi nie wszystkie wyniki znalezione przez findpolecenie.
Stphane,
0

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 /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

Chodzi mi o to, że konieczne było (poprzez wstawienie ./ ), aby sprecyzować, że wykluczone katalogi będą kopiowane.

Moje 0,02 €

Jerzy
źródło
0

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:

zip -r /backup/filename.zip. -x upload / folder / ** \ * upload / folder2 / ** \ *

(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 )

użytkownik2792605
źródło
3
Uwaga: zipnie pakuje pustych katalogów, ale tarrobi to!
t0r0X,
0

Sprawdź to

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
RohitPorwal
źródło
0

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 :

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
dobrivoje
źródło
0

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:

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

Sridhar Kumar N.
źródło
0

Jeśli próbujesz wykluczyć pliki Systemu kontroli wersji (VCS), tar obsługuje już dwie interesujące opcje! :)

  1. Opcja: --exclude-vcs

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 tym
  • RCS/i wszystko pod tym
  • SCCS/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

    1. Opcja: --exclude-vcs-ignoruje

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, .gitignoreitp) 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ę .gitfileznajduje 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: globprzełącza się na wzorce globowania powłoki. Linia syntax: regexpprzełącza się z powrotem. Komentarze zaczynają się od #. Wzorce wpływają na katalog i wszystkie jego podkatalogi.

  1. Przykład

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/

TM
źródło
-1

Poniższy skrypt bash powinien załatwić sprawę. Wykorzystuje odpowiedź podaną tutaj przez Marcusa Sundmana.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

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

James
źródło
1
Wymaganie interaktywnych danych wejściowych jest złym wyborem dla większości skryptów powłoki. Niech zamiast tego przeczyta parametry wiersza polecenia, a uzyskasz korzyści z uzupełniania tabulatora powłoki, uzupełniania historii, edytowania historii itp.
tripleee
1
Ponadto skrypt nie działa w przypadku ścieżek zawierających białe znaki lub metaznaki powłoki. Zasadniczo powinieneś zawsze umieszczać zmienne w podwójnych cudzysłowach, chyba że specjalnie potrzebujesz, aby powłoka wykonała tokenizację białych znaków i interpretację symboli zastępczych. Aby uzyskać szczegółowe informacje, zobacz stackoverflow.com/questions/10067266/…
tripleee