Tar uma lista de arquivos que nem todos existem


10

Estou executando um comando a partir de um script como

tar -c -f ar.tar a b c d

onde b, c e d podem não existir e podem ser diretórios. As soluções apresentadas são canalizar a saída de ls -dpara grep, em seguida, uni-la ao tarcomando ou ativar globs estendidos para @(a|b|c|d).

Existe uma maneira mais clara de fazer isso? Estou no Debian Wheezy, que parece não ter um --includeparâmetro.


Você tem --ignore-failed-readopção?
Costas

1
Tentei, ainda deu um erro para arquivos que não existem.
gidyn

1
Sim, a mensagem de erro está presente, mas o arquivo morto é criado.
Costas

Respostas:


8

podes tentar

 tar cf ar.tar $(ls a b c d )

Onde

  • c para criar
  • f ar.tar especificar arquivo tar

  • $(ls a b c d) listará no stdin qual arquivo está realmente presente (e dará erro para outro)


2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)funciona perfeitamente .. mas eu acho que é mais limpo com extglob
gidyn

agora eu sou portando o script para traço, de forma que nenhum extglob- Eu estou usando o código no meu comentário acima
gidyn

1

Se não há problema em ter o caminho completo dos arquivos no arquivo tar, você pode:

tar -c -f ar.tar $(readlink -e a b c d)

A -eopção de readlink canonizará os nomes de arquivos existentes e ignorará silenciosamente outros.


Eu acho que isso pode funcionar se eu --strip-componentsestiver extraindo.
gidyn

0

Usar

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Explicação

  1. O primeiro parâmetro é o diretório que você deseja pesquisar.
  2. Por padrão, findfaz recursão.
  3. O -osignifica -or. Portanto, acima significa procurar esse curinga OU esse. Se você tiver apenas um padrão, não será necessário -o.
  4. As aspas ao redor do padrão curinga são obrigatórias.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.