Mam tę bardzo prostą linię w skrypcie bash, który wykonuje się pomyślnie (tj. Produkuje _data.tar
plik), z tym wyjątkiem, że nie wyklucza podkatalogów, o których mówi się wykluczenie za pomocą --exclude
opcji:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Zamiast tego tworzy _data.tar
plik, który zawiera wszystko w katalogu / data, w tym pliki w podkatalogach, które chciałem wykluczyć.
Masz pomysł, dlaczego? i jak to naprawić?
Aktualizacja Zaimplementowałem swoje obserwacje na podstawie linku podanego w pierwszej odpowiedzi poniżej (najpierw najwyższy poziom, brak spacji po ostatnim wykluczeniu):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Ale to nie pomogło. Wszystkie „wykluczone” podkatalogi są obecne w _data.tar
pliku wynikowym .
To zastanawia. Niezależnie od tego, czy jest to błąd w bieżącym pliku tar (GNU tar 1.23, na CentOS 6.2, Linux 2.6.32), czy też „ekstremalna wrażliwość” tar na białe spacje i inne łatwe do pominięcia literówki, uważam to za błąd. Na razie.
To jest okropne : wypróbowałem wgląd sugerowany poniżej (bez końcowego /*
) i nadal nie działa w skrypcie produkcyjnym:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Nie widzę żadnej różnicy między tym, co próbowałem, a tym, co próbował @Richard Perrin, z wyjątkiem cudzysłowów i 2 spacji zamiast 1. Zamierzam spróbować (muszę poczekać na uruchomienie nocnego skryptu jako katalogu, którego kopię zapasową chcesz wykonać) jest ogromny) i zgłoś się.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Zaczynam myśleć, że wszystkie te tar --exclude
wrażliwości to nie smoła, ale coś w moim środowisku, ale co to może być?
Zadziałało! Ostatnia wypróbowana odmiana (bez pojedynczych cudzysłowów i pojedynczej spacji zamiast podwójnej spacji między --exclude
s) przetestowana działająca. Dziwne, ale akceptujące.
Nie do wiary! Okazuje się, że starsza wersja tar
(1.15.1) wyklucza się tylko wtedy, gdy katalog najwyższego poziomu jest ostatni w linii poleceń. Jest to dokładne przeciwieństwo wymagań wersji 1.23. FYI.
--exclude b
(spacja zamiast znaku równości) vs.--exclude=b
. Czy to robi różnicę? (nie powinien IMHO)--exclude=
w tej samej linii. Różnica musi być więc idiotyczna/*
, którą dołączyłem do każdego podkatalogu. Przetestuję to dziś wieczorem w skrypcie produkcyjnym i zdam raport. Kolejny +1.Być może twoja wersja
tar
wymaga, aby--exclude
opcje musiały być umieszczone na początkutar
polecenia.Zobacz: https://stackoverflow.com/q/984204
Zobacz: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Alternatywny:
Oto kolejna
tar
wskazówka polecenia :źródło
--exclude=mydir/*
to znaczy, że to nie działa (używatar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); Debian będzie prawdopodobnie dostarczany z wieloma różnymi wersjami smoły przez lata.--exclude
wcześniej-czf
.Aby wykluczyć wiele plików, spróbuj
Pozwoli to zaoszczędzić trochę kodu i bólu głowy. Jest to globalne rozwiązanie dla wszystkich rodzajów programów / opcji. Jeśli chcesz również uwzględnić katalog nadrzędny w swoim wyborze (w tym przypadku dane), musisz dołączyć przecinek końcowy. Na przykład:
źródło
mv /very/very/very/very/long/path/to/a/file{,.bak}
Ten link może być pomocny. http://answers.google.com/answers/threadview/id/739467.html
Dwie bezpośrednie różnice między niedziałającą linią a kilkoma wskazówkami w linku:
--exclude
.źródło
-MAK
przykuła moją uwagę i do tej pory udało mi się zauważyć następujące różnice między moją niedziałającą linią a następującymi: 1. Wszystkie wykluczenia pojawiają się po katalogu najwyższego poziomu. 2. Nie może zawierać żadnych spacji po ostatnim--exclude
. Przetestuję te spostrzeżenia i zdam relację. Na razie +1.Obejściem może być użycie kombinacji
find ... -prune
itar
wykluczenie określonych katalogów.W systemie Mac OS X wydaje się, że
--exclude
opcja GNUtar
działa tak, jak powinna.W poniższym przypadku testowym katalogi
/private/var/log/asl
i/private/var/log/DiagnosticMessages
mają zostać wykluczone ze skompresowanego archiwum/private/var/log
katalogu.źródło
Być może możesz wypróbować polecenie z inną opcją:
I sprawdź, czy działa zgodnie z przeznaczeniem.
źródło
Korzystam z komputera Mac i okazało się, że wykluczenia nie działały, chyba że folder najwyższego poziomu jest ostatnim argumentem
przykład działającego polecenia:
FYI:
źródło
W moim przypadku nie wykluczało to z innego powodu.
Pełna ścieżka vs ścieżka względna.
Zarówno wykluczenie, jak i katalog muszą używać tego samego formatu ścieżki (tj. Zarówno pełna ścieżka, jak i obie ścieżki względne)
Przykład:
To nie zadziała, ponieważ exclude używa pełnej ścieżki, gdzie jako cel używa ścieżki względnej
Działa to, ponieważ oba używają pełnej ścieżki
Działa to, ponieważ oba używają ścieżki względnej
źródło
Zamiast
--exclude=
używać-X
z plikiem tekstowym:http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/
źródło
Dodatkowe uwagi do doskonałej odpowiedzi R. Perrina :
Załóżmy, że nie chcesz archiwizować ścieżek bezwzględnych, ale względnych, np. „Dane” zamiast „/ tmp / data”. Aby wykluczyć ścieżki bezwzględne, argumenty tar będą się różnić w zależności od implementacji tar (tar gnu vs. tar bsd), którego używasz:
źródło
Właśnie wykryto na tar (GNU tar) 1.29
To wywołanie nie wyklucza z plików archiwów określonych parametrem --exclude-from:
To połączenie działa poprawnie:
Kolejność parametrów jest ważna!
źródło
Próbowałem różnych kombinacji, w tym kilku wymienionych odpowiedzi, i po prostu nie mogłem wykluczyć wymienionych plików.
Mając dość gonienia za odpowiedzią na to, co miało być pięciominutową pracą, zrobiłem coś przeciwnego: stworzyłem archiwum folderów, które chciałem dołączyć.
Zrobiłem to, tworząc archiwum, a następnie dodając do niego :
Kilka uwag:
tar
(a nie spakowane archiwum tar.tgz
/.tar.gz
) archiwum - możesz je później skompresować za pomocągzip mybackup.tar
tar tvf mybackup.tar
.źródło