Zazwyczaj robię:
tar -czvf my_directory.tar.gz my_directory
Co jeśli chcę po prostu dołączyć wszystko (w tym ukryte pliki systemowe) do mojego katalogu, ale nie sam katalog? Nie chce:
my_directory
--- my_file
--- my_file
--- my_file
Chcę:
my_file
my_file
my_file
tar -czf
? W moim przypadku jest to tylko przechowywanie plików, a nie katalogu. Kiedy tylkotar
katalog zawiera go, ale wraz ztar -czf
nim dodaje tylko pliki.Odpowiedzi:
powinien wykonać pracę w jednej linii. Działa również dobrze w przypadku ukrytych plików. „*” nie rozwija ukrytych plików przez rozszerzenie nazwy ścieżki przynajmniej w bash. Poniżej znajduje się mój eksperyment:
źródło
.
się*
więc polecenie będziecd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
wtedy będzie działać zgodnie z oczekiwaniami.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
wchodzenie do katalogów i obecnie jest dość kiepskie. Przynajmniej mógłbym użyć,pushd
apopd
jeślitar
nie miałby takich flag-C
.Użyj
-C
przełącznika tar:-C my_directory
Mówi smołę, aby zmienić bieżący katalogmy_directory
, a następnie.
oznacza „dodać cały katalog bieżący” (w tym ukrytych plików i podkatalogów).Upewnij się, że to zrobisz,
-C my_directory
zanim to zrobisz, w.
przeciwnym razie otrzymasz pliki w bieżącym katalogu.źródło
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
” Apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Zawsze staramtar -czvf my_directory.tar.gz * -C my_directory
i To nie działa.-C
lokalizacja jest ważna! Cholerna tar ...*
nie będzie obejmować ukrytych plików (co było pierwotnym wymogiem).Możesz także utworzyć archiwum jak zwykle i rozpakować je za pomocą:
źródło
--strip-components
jest to rozszerzenie GNU.Spójrz na
--transform
/--xform
, daje możliwość masowania nazwy pliku, gdy plik jest dodawany do archiwum:Wyrażenie transformacji jest podobne do wyrażenia
sed
i możemy użyć separatorów innych niż/
(,
w powyższym przykładzie).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
źródło
file list too long
. Moje rozwiązanie temu zapobiega i jest również bardziej elastyczne.--xform
wiele razy dla wielu ścieżek.TL; DR
Z pewnymi warunkami (archiwizuj tylko pliki, katalogi i dowiązania symboliczne):
Wyjaśnienie
Poniżej niestety zawiera katalog nadrzędny
./
w archiwum:Możesz przenieść wszystkie pliki z tego katalogu, korzystając z
--transform
opcji konfiguracji, ale to nie pozbędzie.
samego katalogu. Coraz trudniej oswoić polecenie.Możesz użyć,
$(find ...)
aby dodać listę plików do polecenia (jak w odpowiedzi Magnusa ), ale to potencjalnie powoduje błąd „zbyt długa lista plików”. Najlepszym sposobem jest połączenie go z-T
opcją tar :Zasadniczo robi listę wszystkich plików (
-type f
), links (-type l
) i podkatalogów (-type d
) w twoim katalogu, czyni wszystkie nazwy plików względnymi za pomocą-printf "%P\n"
, a następnie przekazuje je do komendy tar (pobiera nazwy plików z STDIN-T -
).-C
Konieczna jest opcja tak smoła wie, gdzie znajdują się pliki o nazwach względnych.--no-recursion
Flaga jest tak, że smoła nie rekursja w folderach to powiedział do archiwum (powodując zduplikowane pliki).Jeśli potrzebujesz zrobić coś specjalnego z nazwami plików (filtrowanie, śledzenie dowiązań symbolicznych itp.),
find
Polecenie jest dość wydajne i możesz je przetestować, usuwając tylkotar
część powyższego polecenia:Na przykład, jeśli chcesz filtrować pliki PDF, dodaj
! -name '*.pdf'
Nie znaleziono GNU
Polecenie używa
printf
(dostępne w GNUfind
), które każefind
wypisywać wyniki ze ścieżkami względnymi. Jeśli jednak nie masz GNUfind
, działa to tak, aby ścieżki były względne (usuwa rodziców zsed
):źródło
Ta odpowiedź powinna działać w większości sytuacji. Zauważ jednak, jak nazwy plików są przechowywane w pliku tar jako na przykład,
./file1
a nie tylkofile1
. Odkryłem, że spowodowało to problemy podczas korzystania z tej metody do manipulowania plikami tar używanymi jako pliki pakietów w BuildRoot .Jednym z rozwiązań jest użycie niektórych globów Bash do wyświetlenia listy wszystkich plików z wyjątkiem
..
tego:To jest sztuczka, której nauczyłem się z tej odpowiedzi .
Teraz tar zwróci błąd, jeśli nie ma pasujących plików
..?*
lub.[^.]*
, ale nadal będzie działać. Jeśli błąd jest problemem (sprawdzasz sukces w skrypcie), działa to:Chociaż teraz mamy do czynienia z opcjami powłoki, możemy zdecydować, że fajniej jest
*
dopasować ukryte pliki:Może to nie działać, gdy globus powłoki znajduje się
*
w bieżącym katalogu, więc alternatywnie użyj:źródło
tar: start.sh: Cannot stat: No such file or directory
Dzieje się tak ze wszystkimi plikami w moim bieżącym katalogu! Jak tego uniknąć?źródło
Jeśli jest to system Unix / Linux i zależy Ci na ukrytych plikach (które zostaną pominięte przez *), musisz:
Nie wiem, jak wyglądają ukryte pliki w systemie Windows.
źródło
Proponuję następującą funkcję Bash (pierwszy argument to ścieżka do katalogu, drugi argument to nazwa bazy wynikowego archiwum):
Możesz uruchomić go w następujący sposób:
i wygeneruje archiwum
my_archive.tar.gz
w bieżącym katalogu. Działa z ukrytymi (. *) Elementami i elementami ze spacjami w nazwie pliku.źródło
Ten działał dla mnie i obejmuje wszystkie ukryte pliki bez umieszczania wszystkich plików w katalogu głównym o nazwie „.” jak w odpowiedzi Tomoe :
źródło
Przykład:
Zapraszamy.
źródło
To działa dla mnie.
Możesz także użyć
W pierwszym poleceniu find zwraca listę plików i podkatalogów katalogu mój_katalog . Jednak katalog mój_katalog sam jest zawarty na tej liście jako „.” -printf parametr usuwa pełną ścieżkę tym, że „” a także wszystkocrlf Jednakże przestrzeńw format string „% P” z printf liście resztka w liście plików i podkatalogów z my_dir i mogą być postrzegane przez czołowego miejsca w wyniku znajdowania polecenia.
Nie będzie to problemem dla TAR, ale jeśli chcesz to naprawić, dodaj -mindepth 1 jak w drugim poleceniu.
źródło
Użyj pax.
Pax to przestarzałe opakowanie, ale wykonuje to zadanie idealnie i w prosty sposób.
źródło
Najprostszy sposób, w jaki znalazłem:
cd mój_katalog && tar -czvf ../my_dir.tar.gz *
źródło
Bezpiecznie obsługuje nazwy plików ze spacjami lub innymi nietypowymi znakami. Możesz opcjonalnie dodać
-name '*.sql'
podobny lub podobny filtr do polecenia find, aby ograniczyć dołączone pliki.źródło
Jeśli folder jest mytemp, to jeśli zastosujesz powyższe, zostanie on skompresowany i usunie wszystkie pliki w folderze, ale zostaw go w spokoju
Możesz podać wzorce wykluczania, a także określić, aby nie przeglądać również podfolderów
źródło
źródło