comando tar - ignorar links simbólicos

13

Eu uso o comando tar como,

tar -cvf protTests.tar protTests/*

para tartodos os arquivos dentro da pasta protTests. Mas isso inclui os links simbólicos dentro da pasta, o que não é o desejado.

Existe uma opção de linha de comando que deixará de fora todos os links simbólicos?

Gilles 'SO- parar de ser mau'
fonte

Respostas:

11

Você pode fazer isso, para fornecer taruma lista de todos os arquivos, protTestsexceto aqueles que são links simbólicos:

find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
  tar --null --files-from - -cvf protTests.tar

A propósito, seu comando existente:

tar -cvf protTests.tar protTests/*

não arquivará todos os arquivos protTests, apenas arquivará aqueles cujos nomes não começam .(aqueles que não estão ocultos). O *operador glob ignora arquivos cujos nomes começam .por design. O comando também tem o problema de que, se protTestshouver muitos arquivos (mais de muitos milhares), ele protTests/*poderá se expandir para muitos argumentos para caber na linha de comando.

Um comando mais simples como esse não teria nenhum desses problemas:

tar -cvf protTests.tar protTests
Celada
fonte
1
O Tar não tem opção --files-from, esta é uma opção da gtar; portanto, dê um conselho, mencione melhor que isso é específico da gtar. O Find não tem primário -not, esse é outro GNUism não portátil. Em geral, é uma má idéia usar uma chamada de localização separada. Isso pode causar problemas com caracteres engraçados no nome do arquivo e, definitivamente, apresenta um baixo desempenho, pois o find e o tar precisam verificar o sistema de arquivos. Esses problemas não se aplicam a programas como o star que usam libfind e, portanto, têm o código de busca incorporado.
schily
Deixe-me adicionar outra dica geral: ao fornecer um aviso específico para uma variante específica de um programa UNIX de um fornecedor, é uma boa prática mencionar o fornecedor e que ele é específico. Isso geralmente pode ser feito usando os nomes oficiais do software, por exemplo, gtar em vez de tar, vim em vez de vi. Observe que esta é uma plataforma de informações relacionada ao UNIX, portanto, em geral, os exemplos devem estar alinhados com o padrão POSIX.
schily
Você está certo, @schily, esta é uma solução específica do GNU. Sua resposta staré uma boa alternativa e eu a votei por esse motivo. Também concordo com a objeção de "personagens engraçados", mas como o GNU tarnão tem uma -0opção, é uma troca. Eu não concordo com a objeção de desempenho, isso realmente não tem conseqüências nesta situação.
Celada
2
@schily, ambos GNU tare bsdtarhave --files-frome --nullque remove o problema com personagens engraçados (se combinados com find's -print0ou -exec printf '%s\0' {} +). Mas aqui, você provavelmente desejaria adicionar a --no-recursionopção. Algumas paximplementações também têm uma -0opção.
Stéphane Chazelas
2
@ Schily Eu sinto que este tópico de comentário não é o lugar para advocacy para diferentes versões do tar. Por favor, leve-o para conversar . Já é muito longo e parece uma guerra religiosa. A menos que o OP esteja em sintonia neste momento, acho que não importa qual versão tarestá em uso. Nem sabemos que tipo de Unix eles estão usando.
Celada
-2

Minha implementação de tar é o melhor método

star -cv -f out.tar -find protTests ! -type l
esperto
fonte
8
zsh: command not found: starQuando você mencionar utilitários que você sabe que> 99% dos seus leitores não terão em seus sistemas, explique onde obtê-los. E você deve divulgar sua afiliação quando mencionar seu próprio produto (se você publica o link ou não, para que você também publique o link).
Gilles 'SO- stop be evil
Atualmente, um sistema Linux típico perde muitos softwares importantes após uma instalação padrão e, ao mesmo tempo, muitos softwares inúteis são instalados. Um usuário do Linux deve saber como instalar o software ausente e as pessoas que usam frequentemente o tar geralmente têm o star instalado de qualquer maneira.
schily
8
A grande maioria das pessoas que costuma usar alcatrão nunca ouviu falar de pax, muito menos de estrelar.
Gilles 'SO- stop be evil' em
Bem, aquelas pessoas que não sabem que estão usando gtar no Linux quando chamam "tar" provavelmente não são as pessoas que se importam. Star é a mais antiga implementação de alcatrão livre e muitos recursos vistos em várias implementações de alcatrão foram retirados da estrela, então por que não falar sobre o original?
schily