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.

gidyn
fonte
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)

Archemar
fonte
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.

Anthon
fonte
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.
Shital Shah
fonte