polecenie tar - pomiń dowiązania symboliczne

13

Używam polecenia tar jako,

tar -cvf protTests.tar protTests/*

do tarwszystkich plików wewnątrz folderu protTests. Dotyczy to jednak dowiązań symbolicznych w folderze, co nie jest pożądane.

Czy istnieje opcja wiersza poleceń, która pomija wszystkie dowiązania symboliczne?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

11

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 -cvf protTests.tar protTests
Celada
źródło
1
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ą.
Celada
-2

Moja implementacja tar jest najlepszą metodą

star -cv -f out.tar -find protTests ! -type l
schily
źródło
8
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?
schily