W porządku, taki prosty problem. Pracuję nad prostym kodem zapasowym. Działa dobrze, chyba że pliki zawierają spacje. Oto jak znajduję pliki i dodam je do archiwum tar:
find . -type f | xargs tar -czvf backup.tar.gz
Problem występuje, gdy plik ma spację w nazwie, ponieważ tar myśli, że jest to folder. Zasadniczo czy istnieje sposób, w jaki mogę dodawać cudzysłowy wokół wyników wyszukiwania? Albo inny sposób, aby to naprawić?
find ... | xargs ...
jest użycie -print0 / -0 parametru na każdy:find -print0 ... | xargs -0 ...
. Spowoduje to, że nazwy plików zostaną oddzielone znakiem null, co oznacza, że możesz mieć spacje, znaki nowej linii lub inne dziwne rzeczy w nazwach plików i nadal będzie działać.Odpowiedzi:
Użyj tego:
To będzie:
tar -c
wxargs
przypadku, gdy masz dużą liczbę plikówZobacz także:
źródło
-print0
ma zastosowanie tylko do ostatniego wyrażenia. Np.find . \( -type f -o -name '*.c' \) -print0 | ...
c:\cygwin\bin\find . -regextype posix-egrep -regex '.*(sln^|vcxproj^|filters)$' -print0 | c:\cygwin\bin\tar -cvf MS_Projects.tar --null -T -
-T
, a to oznacza odczyt nazw plików ze standardowego wejścia: Jeśli podasz pojedynczy myślnik jako nazwę pliku dla `--files-from ', (tj. Określisz albo --files-from = - lub -T -), wtedy nazwy plików są odczytywane ze standardowego wejściaMoże istnieć inny sposób na osiągnięcie tego, czego chcesz. Gruntownie,
Następnie tar z opcją -T, która pozwala na pobranie listy lokalizacji plików (tej, którą właśnie utworzyłeś za pomocą find!)
źródło
Spróbuj biegać:
źródło
Dlaczego nie:
Jasne, że sprytnie jest użyć funkcji find, a następnie xargs, ale robisz to na własnej skórze.
Aktualizacja: Porges skomentował opcję znajdowania, która moim zdaniem jest lepszą odpowiedzią niż moja odpowiedź lub inna:
find -print0 ... | xargs -0 ....
źródło
xargs ... tar c ...
nadpisze pierwsze utworzone archiwum, jeśli lista plików jest zbyt długa ixargs
uruchomi siętar
po raz drugi! Aby uniknąć nadpisywania, możesz użyć,xargs -x
ale wtedy archiwum może być niekompletne. Alternatywą może być najpierw,tar c ...
a potem prawdopodobnie wielokrotnietar r ...
. (mój wkład w niezawodność :)Jeśli masz wiele plików lub katalogów i chcesz je spakować do niezależnego
*.gz
pliku, możesz to zrobić. Opcjonalny-type f -atime
To się skompresuje
do
źródło
Dlaczego nie spróbować czegoś takiego:
tar cvf scala.tar `find src -name *.scala`
źródło
Inne rozwiązanie, jak widać tutaj :
źródło
Dodałby komentarz do posta @Steve Kehlet, ale potrzebuję 50 powtórzeń (RIP).
Dla każdego, kto znalazł ten post poprzez liczne wyszukiwania w Google, znalazłem sposób, aby nie tylko znaleźć określone pliki w określonym przedziale czasowym, ale także NIE uwzględniać ścieżek względnych LUB białych znaków, które powodowałyby błędy tarowania. (DZIĘKUJĘ WIELE STEVE).
.
katalog względny-name "*.pdf"
poszukaj plików PDF (lub dowolnego typu)-type f
typ do wyszukania to plik-mtime 0
szukaj plików utworzonych w ciągu ostatnich 24 godzin-printf "%f\0"
Zwykłe-print0
LUB-printf "%f"
NIE działa dla mnie. Ze stron podręcznika:-czvf
tworzenie archiwum, filtrowanie archiwum przez gzip, szczegółowa lista przetworzonych plików, nazwa archiwumEdycja 2019-08-14: Chciałbym dodać, że mogłem również użyć zasadniczo tego samego polecenia w moim komentarzu, używając tylko samego tar:
Potrzebne
--ignore-failed-read
na wypadek, gdyby nie było dzisiaj nowych plików PDF.źródło
Najlepszym rozwiązaniem wydaje się utworzenie listy plików, a następnie zarchiwizowanie plików, ponieważ można użyć innych źródeł i zrobić coś innego z listą.
Na przykład pozwala to na użycie listy do obliczenia rozmiaru archiwizowanych plików:
źródło