Możesz to zrobić, aby dostarczyć tarlistę wszystkich plików protTestspoza tymi, które są dowiązaniami symbolicznymi:
find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
tar --null --files-from - -cvf protTests.tar
Nawiasem mówiąc, twoje istniejące polecenie:
tar -cvf protTests.tar protTests/*
nie zarchiwizuje wszystkich plików protTests, zarchiwizuje tylko tych, których nazwy nie zaczynają się .(te, które nie są ukryte). *Operator glob pomija pliki, których nazwy zaczynają się .od projektu. Polecenie ma również problem polegający na tym, że jeśli protTestsma dużo plików (więcej niż wiele tysięcy), protTests/*może rozwinąć się do zbyt wielu argumentów, aby zmieściły się w linii poleceń.
Takie prostsze polecenie nie miałoby żadnego z tych problemów:
Tar nie ma opcji --files-from, jest to opcja z gtar, więc dasz taką radę, lepiej wspomnij, że jest to specyficzne dla gtar. Find nie ma podstaw -not, to kolejny nieprzenośny GNUism. Ogólnie rzecz biorąc, złym pomysłem jest użycie osobnego wywołania find. Może to powodować problemy ze śmiesznymi znakami w nazwie pliku i zdecydowanie daje niską wydajność, ponieważ zarówno find, jak i tar muszą skanować system plików. Te problemy nie dotyczą programów takich jak star, które używają libfind i dlatego mają włączony kod wyszukiwania.
schily
Pozwolę sobie dodać kolejną ogólną wskazówkę: udzielając porady, która jest specyficzna dla konkretnego wariantu programu UNIX dla konkretnego dostawcy, dobrą praktyką jest wspomnieć o dostawcy i że jest on specyficzny dla dostawcy. Zazwyczaj można to zrobić, używając oficjalnych nazw oprogramowania, np. Gtar zamiast tar, vim zamiast vi. Zauważ, że jest to platforma informacyjna związana z UNIX, więc ogólnie przykłady powinny być dostosowane do standardu POSIX.
schily
Masz rację, @schily, jest to rozwiązanie specyficzne dla GNU. Twoja odpowiedź oparta na starjest dobrą alternatywą i z tego powodu głosowałem za nią. Zgadzam się również z zastrzeżeniem „zabawnych postaci”, ale ponieważ GNU tarnie ma -0opcji, jest to kompromis. Ja nie zgadzam się z zarzutem wydajności, to naprawdę nie ma znaczenia w tej sytuacji.
Celada
2
@schily zarówno GNU tari bsdtarmają --files-fromi --nullktóry usuwa problem z dziwnych znaków (w połączeniu z find„y -print0lub -exec printf '%s\0' {} +). Ale tutaj prawdopodobnie chcesz dodać tę --no-recursionopcję. Niektóre paximplementacje mają również -0opcję.
Stéphane Chazelas
2
@schily Uważam, że ten wątek komentarza nie jest miejscem promowania różnych wersji tar. Weź to na czacie . Jest już za długo i czyta się jak wojna religijna. Chyba że w tym momencie zadzwoni OP, nie sądzę, że ma znaczenie, która wersja tarjest używana. Nie wiemy nawet, jakiego rodzaju Uniksa używają.
zsh: command not found: starKiedy wspominasz o narzędziach, o których wiesz, że> 99% czytelników nie ma ich w systemach, wyjaśnij, skąd je wziąć. I trzeba ujawniać przynależność kiedy wspomina swój produkt (czy linka czy nie, więc równie dobrze można zamieścić odnośnik).
Gilles „SO- przestań być zły”
Typowy system Linux obecnie traci dużo ważnego oprogramowania po domyślnej instalacji, a jednocześnie instaluje się wiele bezużytecznego oprogramowania. Użytkownik Linuksa powinien wiedzieć, jak zainstalować brakujące oprogramowanie, a osoby, które często używają tar, i tak zazwyczaj mają zainstalowane star.
schily
8
Zdecydowana większość ludzi, którzy często używają smoły, nigdy nie słyszała o pax, nie mówiąc już o gwiazdach.
Gilles „SO- przestań być zły”
Cóż, ci ludzie, którzy nie wiedzą, że używają gtar w Linuksie, gdy nazywają „tar”, prawdopodobnie nie są tymi, którzy się tym przejmują. Gwiazda jest najstarszą darmową implementacją tar i wiele funkcji widocznych w różnych implementacjach tar zostało zaczerpniętych z gwiazdy, więc dlaczego nie mówić o oryginale?
--files-from
, jest to opcja z gtar, więc dasz taką radę, lepiej wspomnij, że jest to specyficzne dla gtar. Find nie ma podstaw-not
, to kolejny nieprzenośny GNUism. Ogólnie rzecz biorąc, złym pomysłem jest użycie osobnego wywołania find. Może to powodować problemy ze śmiesznymi znakami w nazwie pliku i zdecydowanie daje niską wydajność, ponieważ zarówno find, jak i tar muszą skanować system plików. Te problemy nie dotyczą programów takich jak star, które używają libfind i dlatego mają włączony kod wyszukiwania.star
jest dobrą alternatywą i z tego powodu głosowałem za nią. Zgadzam się również z zastrzeżeniem „zabawnych postaci”, ale ponieważ GNUtar
nie ma-0
opcji, jest to kompromis. Ja nie zgadzam się z zarzutem wydajności, to naprawdę nie ma znaczenia w tej sytuacji.tar
ibsdtar
mają--files-from
i--null
który usuwa problem z dziwnych znaków (w połączeniu zfind
„y-print0
lub-exec printf '%s\0' {} +
). Ale tutaj prawdopodobnie chcesz dodać tę--no-recursion
opcję. Niektórepax
implementacje mają również-0
opcję.tar
. Weź to na czacie . Jest już za długo i czyta się jak wojna religijna. Chyba że w tym momencie zadzwoni OP, nie sądzę, że ma znaczenie, która wersjatar
jest używana. Nie wiemy nawet, jakiego rodzaju Uniksa używają.Moja implementacja tar jest najlepszą metodą
źródło
zsh: command not found: star
Kiedy wspominasz o narzędziach, o których wiesz, że> 99% czytelników nie ma ich w systemach, wyjaśnij, skąd je wziąć. I trzeba ujawniać przynależność kiedy wspomina swój produkt (czy linka czy nie, więc równie dobrze można zamieścić odnośnik).