Prawdopodobnie mogę napisać skrypt powłoki, aby znaleźć tylko pliki, a następnie przekazać listę do tar, ale zastanawiam się, czy jest już wbudowana funkcja w tar, która pozwala to zrobić w jednym wierszu poleceń?
Na przykład znalazłem --no-recursion
przełącznik, ale kiedy to zrobię:
tar --no-recursion -cvf mydir.tar mydir
Archiwizuje tylko nazwy wpisów w katalogu (w tym podkatalogów!), Ale nie archiwizuje żadnych plików.
Próbowałem także:
tar --no-recursion -cvf mydir.tar mydir/*
Ale chociaż archiwizuje tylko pliki, archiwizuje także nazwy podkatalogów.
Czy istnieje sposób, aby powiedzieć tylko pliki tar, bez katalogów?
find mydir -type f |xargs cp -t tempdir
a następnie tempdir tar.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. W+
umieszcza wszystkie pliki znajdujące się na tej samej linii poleceń jak xargs.Odpowiedzi:
Jak wskazuje camh, poprzednie polecenie miało niewielki problem polegający na tym, że zważywszy na zbyt wiele nazw plików, wykonałoby się więcej niż jeden raz, a późniejsze wywołania cicho wymazały poprzednie uruchomienia. Ponieważ my również nie kompresujemy, możemy nadpisać zamiast zastąpić:
Odpowiedź Iocnarz za korzystania z
tar
„s--null
i-T
opcji działa tak dobrze. Jeślicpio
zainstalowałeś, odpowiedź camh za pomocą tego jest również w porządku. A jeśli maszzsh
i nie masz nic przeciwko użyciu go do polecenia, odpowiedź Gillesa przy użyciu zsh glob (*(.)
) wydaje się najprostsza.Kluczem była
-maxdepth
opcja. Ostateczna odpowiedź, odpowiednio zajmująca się spacjami:Powinno to również działać:
źródło
tar
. Zarówno z wariantem, jakxargs
ifind
z+
maksymalną liczbą argumentów, które można przekazać tarowi. Spowoduje to drugie wywołanie tar zastępujące dane wyjściowe pierwszego.-x
aby zmusić xargs do awarii zamiast utraty danych, i chociaż jest lepszy niż cichy błąd utraty danych, nadal nie jest idealny. Ten błąd sortowania jest tak niebezpieczny, ponieważ na początku wszystko wydaje się OK, ale gdy lista plików rośnie z czasem, zaczynasz ją uruchamiać i możesz nie zauważyć, dopóki nie spróbujesz przywrócić kopii zapasowej. Potem jest już za późno.Gdy chcesz korzystać
find
ztar
, najlepszym sposobem jest użyciecpio
zamiasttar
.cpio
potrafi pisać archiwa tar i jest przeznaczony do pobierania listy plików do archiwizacji ze standardowego wejścia.Używanie
find
icpio
jest bardziej uniksowym podejściem, ponieważ pozwalaszfind
dokonywać wyboru plików z całą mocą, jaką posiada, i pozwalaszcpio
na archiwizację. Warto nauczyć się tego prostego użyciacpio
, ponieważ łatwo jest rozwiązywać problemy, z którymi walczysz podczas próbytar
.źródło
-maxdepth
wcześniej-type
.Nie jestem pewien, czy rozumiem twoje wymagania. Jeśli chcesz przechowywać zwykłe pliki
mydir
ale nie ich podkatalogi, najłatwiejszym sposobem jest użycie zsh, gdzie dopasowanie tylko zwykłych plików jest prostą sprawą przy użyciu.
kwalifikatora glob :źródło
Możesz nawet użyć
find ... -print0
itar ... --null
bezpośrednio, bez korzystaniaxargs
w ogóle.W podanym przykładzie
--no-recursion
opcjatar
to nie jest konieczna, ponieważ przekazywane będą tylko ścieżki plików (a nie katalogów)find
celutar
.Jednak użycie
--no-recursion
opcjitar
w poniższym przykładzie zapobiegatar
podwójnemu archiwizowaniu katalogów.find
wykona rekursję drzewa katalogów zamiasttar
tego.źródło
Jako akapit wprowadzający w
man tar
mówi (ostatnie zdanie),Które rozumiem jako odpowiedź „nie” na twoje pytanie.
źródło
--no-recursion
,--exclude-tag
itp). Patrzę,--exclude-tag
który wygląda obiecująco, ale wydaje się być dokładnym przeciwieństwem tego, czego szukam.Pomiń
-C startdir
i zamień.
wstartdir
razie powinno pojawić się w archiwum.Jest to najbardziej wydajna metoda oparta na funkcjach libfind. Libfind oferuje również elementy podstawowe,
-chown
-chgrp
-chmod
które modyfikują struktury struct i pozwalają na archiwizację różnych metadanych. Działa to również w trybie listy i wypakowywania i pozwala uniknąć rozpakowywania całego archiwum w wielu przypadkach.źródło
-find
w-copy
trybie. Streszczenie strony podręcznika sugeruje, że możesz, ale nie udało mi się sprawić, by działała (podczas próby odpowiedzi Jak skopiować zmodyfikowane pliki przy zachowaniu struktury folderów ) (ze schily-2016-02-10)star -find
.Mógłbym znaleźć rozwiązanie.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Może to być trochę kosztowne, ale i tak będzie działać, ponieważ nie zależy to od xargs.
źródło
dir = twój_katalog; cd $ dir; tar -cvf plik.tar `znajdź. -maxdepth 1 -typ f -print`
źródło