Próbuję tar.gz katalog i używam
tar -czf workspace.tar.gz *
Wynikowy plik tar zawiera .svn
katalogi w podkatalogach, ale NIE w katalogu bieżącym (ponieważ *
jest rozwijany tylko do 'widocznych' plików przed przekazaniem do tar
Starałem się
tar -czf workspace.tar.gz .
zamiast tego pojawia się błąd, ponieważ „.” zmienił się podczas czytania:
tar: ./workspace.tar.gz: file changed as we read it
Czy istnieje sztuczka, która pozwala *
dopasować wszystkie pliki (łącznie z kropkami) w katalogu?
(używając bash w systemie Linux SLES-11 (2.6.27.19)
linux
bash
design-patterns
tar
Micha
źródło
źródło
Odpowiedzi:
Nie twórz pliku tar w katalogu, który pakujesz:
załatwia sprawę, poza tym, że po rozpakowaniu rozpakuje pliki w całym bieżącym katalogu. Lepiej zrobić:
cd .. tar -czf workspace.tar.gz workspace
lub, jeśli nie znasz nazwy katalogu, w którym byłeś:
base=$(basename $PWD) cd .. tar -czf $base.tar.gz $base
(Zakłada się, że nie podążałeś za dowiązaniami symbolicznymi, aby dotrzeć do miejsca, w którym się znajdujesz i że powłoka nie próbuje odgadnąć Cię ponownie, przeskakując wstecz przez łącze symboliczne -
bash
nie jest godna zaufania pod tym względem. Jeśli musisz się o to martwić, użyjcd -P ..
do wykonania fizycznego katalogu zmian. Głupie, że nie jest to domyślne zachowanie w moim odczuciu - mylące przynajmniej dla tych, dla którychcd ..
nigdy nie miało żadnego innego znaczenia.)Jeden komentarz w dyskusji mówi:
Pierwsza część komentarza nie ma większego sensu - jeśli plik tar zawiera bieżący katalog, nie zostanie on utworzony podczas wypakowywania pliku z tego archiwum, ponieważ z definicji bieżący katalog już istnieje (z wyjątkiem bardzo dziwnych okoliczności ).
Z drugą częścią komentarza można sobie poradzić na dwa sposoby:
/tmp
jest to jedna możliwa lokalizacja - a po zakończeniu przenieś go z powrotem do pierwotnej lokalizacji.--exclude=workspace.tar.gz
opcji. Ciąg po=
znaku jest wzorcem - przykład jest najprostszym wzorcem - dokładnym dopasowaniem. Może być konieczne określenie,--exclude=./workspace.tar.gz
czy pracujesz w bieżącym katalogu wbrew zaleceniom; może być konieczne określenie,--exclude=workspace/workspace.tar.gz
czy przechodzisz o jeden poziom wyżej, zgodnie z sugestią. Jeśli masz wiele plików tar do wykluczenia, użyj „*
”, jak w--exclude=./*.gz
.źródło
Jeśli naprawdę nie chcesz dołączać głównego katalogu do archiwum tar (a to ogólnie zły pomysł):
źródło
Acdrtux
lub jedną z długich nazw funkcji. Litera funkcyjna nie musi być poprzedzona prefiksem-
i może być łączona z innymi opcjami jednoliterowymi.Należy wykonać kilka czynności:
*
,.
aby uwzględnić również pliki ukryte.--exclude=workspace.tar.gz
można użyć do wykluczenia samego archiwum.tar: .: file changed as we read it
wystąpieniu błędu, gdy archiwum nie zostało jeszcze utworzone, upewnij się, że istnieje (np. Używająctouch
), więc opcja --exclude pasuje do nazwy pliku archiwum. (Nie pasuje, plik nie istnieje)W połączeniu daje to następujący skrypt:
źródło
--verbose
, tak:-czvf
.w katalogu, który chcesz skompresować (bieżący katalog), spróbuj tego:
źródło
.gz
pliki w katalogu.Możesz dołączyć ukryte katalogi, cofając się do katalogu i wykonując:
cd .. tar czf workspace.tar.gz workspace
Zakładając, że katalog, który chcesz zgzipować, nazywa się obszarem roboczym.
źródło
tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
-
przed,czf
żeby to zadziałało. W przeciwnym razie otrzymywałemCannot stat: No such file or directory
komunikat o błędzie..
Formularz możesz poprawić za pomocą--exclude
:źródło
Aktualizacja: dodałem poprawkę do komentarza OP.
rzeczywiście zmieni bieżący katalog, ale dlaczego nie umieścić pliku w innym miejscu?
tar -czf somewhereelse/workspace.tar.gz . mv somewhereelse/workspace.tar.gz . # Update
źródło
Właściwie problem dotyczy opcji kompresji. Sztuczka polega na tym, by przesłać wynik smoły do kompresora zamiast korzystać z wbudowanych opcji. Nawiasem mówiąc, może to również zapewnić lepszą kompresję, ponieważ możesz ustawić dodatkowe opcje kompresji.
Minimalna ilość smoły:
Podłącz rurkę do wybranej sprężarki. Ten przykład jest rozwlekły i używa xz z maksymalną kompresją:
Rozwiązanie zostało przetestowane na Ubuntu 14.04 i Cygwin pod Windows 7. Jest to odpowiedź wiki społeczności, więc jeśli zauważysz błąd, możesz ją edytować.
źródło
Problem z większością przedstawionych tutaj rozwiązań polega na tym, że smoła zawiera się
./
na początku każdego wpisu. Tak więc powoduje to posiadanie.
katalogu podczas otwierania go przez kompresor GUI. Tak więc skończyłem:ls -1A | xargs -d "\n" tar cfz my.tar.gz
Jeśli masz już
my.tar.gz
w bieżącym katalogu, możesz chcieć to grepować:ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
Pamiętaj, że xargs ma pewne ograniczenia (zobacz
xargs --show-limits
). Więc to rozwiązanie nie zadziała, jeśli próbujesz stworzyć pakiet, który ma wiele wpisów (katalogów i plików) w katalogu, który próbujesz tar.źródło
Dobre pytanie. W ZSH możesz użyć modyfikatora globbing
(D)
, który oznacza „dotfiles”. Porównać:ls $HOME/*
i
ls $HOME/*(D)
To poprawnie wyklucza specjalne wpisy katalogu
.
i..
. W Bash możesz użyć,.*
aby jawnie dołączyć pliki dotfiles:ls $HOME/* $HOME/.*
Ale to obejmuje
.
i..
również, więc nie tego szukałeś. Jestem pewien, że istnieje sposób na tworzenie*
dopasowanych plików dotfiles w bashu.źródło
.??*
aby dopasować wszystkie pliki z kropkami nie.
i..
. To nie daje plików jednoznakowych (takich jak.a
). Aby je również zdobyć, użyj bardziej skomplikowanego.[^.]*
.Jeszcze inne rozwiązanie, zakładając, że liczba pozycji w folderze nie jest duża:
(
ls -A
drukuje zwykłe i ukryte pliki, ale nie „.” i „..”, jakls -a
ma to miejsce).źródło
Określenie
.??*
obejmie pliki i katalogi z „kropką”, które mają co najmniej 2 znaki po kropce. Wadą jest to, że nie będzie zawierał plików / katalogów z pojedynczym znakiem po kropce, na przykład.a
jeśli takie istnieją.źródło
Jeśli miejsce na dysku nie stanowi problemu, może to być również bardzo łatwe:
źródło
Ja miałem podobną sytuację. Myślę, że najlepiej jest utworzyć tar w innym miejscu, a następnie użyć -C, aby poinformować tar o katalogu podstawowym skompresowanych plików. Przykład:
W ten sposób nie ma potrzeby wykluczania własnego pliku tar. Jak zauważono w innych komentarzach, -A wyświetli listę ukrytych plików.
źródło
10 lat później masz alternatywę dla
tar
, zilustrowaną przez Git 2.30 (Q1 2021), który używa "git archive
" ( man ) do stworzenia paczki z wydaniem zamiast tar.(Nie potrzebujesz Git 2.30, aby zastosować tę alternatywę)
Zobacz zobowiązanie 4813277 (11 października 2020 r.) I zobowiązanie 93e7031 (10 października 2020 r.) Autorstwa René Scharfe (
rscharfe
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 63e5273 , 27 października 2020 r.)Więc zamiast:
Możesz to zrobić używając tylko Gita:
Zostało to początkowo zaproponowane, ponieważ, jak wyjaśniono tutaj , niektóre egzotyczne platformy mogą mieć starą dystrybucję tar z brakującymi opcjami.
źródło
Używanie
find
jest prawdopodobnie najłatwiejszym sposobem:find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+
find . -maxdepth 1
znajdzie wszystkie pliki / katalogi / dowiązania symboliczne / etc w bieżącym katalogu i uruchomi polecenie określone przez-exec
. W{}
poleceniu oznacza , że lista plików idzie tutaj i\+
oznacza, że polecenie zostanie uruchomione jako:zamiast
źródło