Se for uma opção para alterar a chamada tar
:
test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |
Eu tenho uma pasta com esse conteúdo (as subpastas e os nomes dos arquivos são fixos e não podem ser alterados):
# ls
data/ config/ myfile
Eu preciso criar um arquivo tar para stdout para processá-lo com dd
em um script Bash; suponha, por exemplo, desta forma, por uma questão de simplicidade:
# /bin/tar -cz data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null
Imediatamente após esta instrução, eu verifico a variável ${PIPESTATUS[0]}
para 0 para saber que tar
fez seu trabalho com sucesso.
O problema é que myfile
é opcional para mim e, se estiver faltando, meu ${PIPESTATUS[0]}
se torna 2, embora eu não queira considerá-lo um erro. Então, como posso instruir tar
a ignorar arquivos de entrada ausentes? Eu preferiria uma declaração de uma linha, se possível.
So how can I instruct tar to ignore missing input files?
É muito simples: basta usar o sinal --ignore-failed-read
no seu comando tar
:
$ /bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null
$ echo ${PIPESTATUS[0]}
> 0
BTW: Note que a resposta do Hauke Laging é mais complicada, mas tar
só retorna 0 se está tudo ok, ou se o único arquivo faltando é myfile
... com este , tar
retorna 0 se estiver tudo ok, ou mesmo quando algum arquivo estiver faltando.
Com isso:
/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null
(observe que não estou redirecionando stderr
de tar
para /dev/null
) se myfile
não existir, tar
retornará 0
(se não houver outros erros, é claro) e você recebe isso em stderr
: /bin/tar: myfile: Warning: Cannot stat: No such file or directory
tar
manual diz:
‘--ignore-failed-read’ Do not exit with nonzero on unreadable files or directories. This option has effect only during creation. It instructs tar to treat as mild conditions any missing or unreadable files (directories). Such failures don’t affect the program exit code, and the corresponding diagnostic messages are marked as warnings, not errors. These warnings can be suppressed using the ‘--warning=failed-read’ option
mas, infelizmente, --warning=failed-read
suprime todos os avisos sobre erros de leitura: no seu caso, suprime avisos sobre um arquivo que não existe, mas também suprime o aviso sobre erros de E / S , por exemplo ... está longe de ser ótimo; aparentemente, tar
não tem um sinalizador para dizê-lo: ei, suprima o aviso de falha de leitura somente se o arquivo não existir , então, isso pode resolver o seu problema:
/bin/tar -cz --ignore-failed-read data config myfile 2> >(grep -v 'No such file or directory' 1>&2) | /bin/dd of=backup.tar 2>/dev/null
isto: >( ... )
é Substituição do Processo
Dessa forma, o comando tail
não altera seu número de retorno se o arquivo não existir, você não recebe mensagens de aviso sobre arquivos ausentes e recebe mensagens de aviso sobre qualquer outro erro de leitura.
Eu não posso deixar de pensar que nenhuma dessas soluções é realmente boa, então, eu inventei isso:
/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null
com isso, você está enviando para tar
apenas os arquivos que realmente existem no momento da execução do comando: você não precisa se preocupar com seus nomes, ou mesmo qual arquivo existe ou não: você sempre executa o mesmo comando (não importa o que), escalas perfeitamente se você tiver 1 arquivo ausente, ou arquivos n faltando, e você não perca nenhum erro.
(observe a barra invertida se a frente do comando ls
: dessa forma, você evita% al_de% alias, portanto, sua saída é mais confiável)