2012-07-18 11 views
9

Mam następujący chcę zrobić:
find . -maxdepth 6 (-name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra) -prune -o -print| tar cvf somefile.tar --files-from=-
tj wykluczać całe mnóstwo rzeczy, tylko patrzeć do 6 subdirs głębokości, a następnie raz przycinanie odbywa, smoła się reszta.znaleźć z xargs i smoły

Nie twarde. Bit przed potokiem (|) działa w 100%. Jeśli wykluczyć tar, otrzymuję to, co jestem po (na ekranie). Ale gdy już dołączę fajkę i smołę, wszystko to zniszczy, włączając w to wszystkie rzeczy, które właśnie wykluczyłem w znalezisku.

Próbowałem już różnych iteracji:
-print0 | xargs -0 tar rvf somefile.tar
-print0 | xargs -0 tar rvf somefile.tar --null --files-from = -
-print0 | tar cvf somefile.tar --null -T -

Co więc robię źle? Zrobiłem to już wcześniej; ale teraz daje mi tylko siwe włosy.

+0

wierzę trzeba cytaty całym '* .tar.gz' unikać jej coraz rozszerzona przez' bash' zanim przeszedł do 'find' – drevicko

Odpowiedz

5

Pamiętam, że robiłem coś w rodzaju poniższej linii, aby zgrupować kilka plików razem. I był specyficzny o plikach Chcę grupy, więc pobiegł coś takiego

find . -name "*.xyz" | xargs tar cvf xyz.tar; 

w Twoim przypadku, zastanawiam się, dlaczego robisz „-o” przed -Print, który wydaje się być znowu w tym wszystko

+4

mnie poprawić, jeśli I” m źle, ale wierzę, że jeśli masz wiele plików wypisanych przez 'find',' xargs' uruchomi 'tar' wiele razy z podzbiorami listy plików. Niestety, '-c' następnie nadpisuje poprzednie pliki tar i dostajesz tylko ostatnią partię w ostatecznym pliku tar. – drevicko

+0

Możesz spróbować. Pomyślnie dostałem plik tar z 7-8 plikami, które przeszukałem przy użyciu find. Co się dzieje tutaj, to Find return output i xargs przekazuje je do tar, generując pojedynczy plik tar – rajshenoy

+2

@jajshenoy 7-8 plików prawdopodobnie nie wystarczy, aby odkryć ten problem. Spójrz na sekcję "Maksymalna długość polecenia" na [tej stronie] (http: // offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html). Spróbuj 'echo | xargs --show-limits' aby zobaczyć rozmiar bufora wiersza poleceń xargs używa - dla mnie jest to 131072. To dość duże, ale jeśli masz kilka tysięcy plików, to jest szybko zużyte! – drevicko

3

Jeśli twoje wyszukiwanie zwraca katalogi, zostaną one przekazane do tar, a cała zawartość zostanie uwzględniona, niezależnie od wyłączeń w twoim poleceniu find.

Tak więc myślę, że musisz dołączyć "typ-f" do znaleziska.

13

Co zadziałało dla mnie to połączenie flagi -print w celu znalezienia, a następnie --files-from w komendzie tar. W moim przypadku muszę zaatakować ponad 5000 plików dziennika, ale samo użycie xargs dało mi 500 plików w wynikowym pliku.

find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from - 

Trzeba "--files-from = -", gdy chcesz po prostu "--files-u -" a potem myślę, że trzeba a - przed CVF, jak poniżej.

find . -maxdepth 6 (-name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra) -prune -o -print| tar -cvf somefile.tar.gz --files-from - 
+2

To jest poprawne rozwiązanie, ponieważ użycie '--files-from-'pozwala uniknąć problemu z limitami xargs (jasne w komentarzach na przykładzie @ rajshenoy), co powoduje, że niekompletne archiwa. –

0

używam kombinację dwóch podejść wyżej - do tworzenia kopii zapasowych dzień pracy to zrobić: rm -rf new.tgz; odnaleźć . -type f -mtime 0 | xargs tar cvf new.tgz;

0

Używanie plików bez opcji było jedyną opcją dla mnie. Wszystkie inne opcje obejmowały wszystkie pliki w katalogu zamiast mojej wygenerowanej listy.

To było moje rozwiązanie:

find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from 
Powiązane problemy