So how can I instruct tar to ignore missing input files?
Es realmente simple :simplemente use el indicador
--ignore-failed-read
en su comandotar
:$
/bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null
$
echo ${PIPESTATUS[0]}
> 0
Por cierto :Tenga en cuenta que la respuesta de Hauke Laging es más engorrosa, pero
tar
solo devuelve 0 si todo está bien, o si el único archivo que falta esmyfile
... con esto,tar
devuelve 0 si todo está bien, o incluso cuando falta algún archivo.Con esto:
/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null
(tenga en cuenta que no estoy redirigiendo
stderr
detar
a/dev/null
)simyfile
no existe,tar
devuelve0
(si no hay otros errores, por supuesto )y obtienes esto enstderr
:/bin/tar: myfile: Warning: Cannot stat: No such file or directory
tar
manual dice:‘--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
pero, lamentablemente,
--warning=failed-read
suprima todas las advertencias sobre errores de lectura -:en su caso, suprima las advertencias sobre un archivo que no existe, pero también suprima las advertencias sobre errores de E/S , por ejemplo... está lejos de ser óptimo; aparentemente,tar
no tiene una bandera para decirlo:oye,supresión fallida -advertencia de lectura solo si el archivo no existe , entonces, puede ser, esto resuelva su 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
esto:
>(... )
es Sustitución de procesosde esta manera, su comando
tail
no cambia su número de retorno si el archivo no existe, no recibe mensajes de advertencia sobre archivos faltantes y recibe mensajes de advertencia sobre cualquier otro error de lectura.esto>
No puedo evitar pensar que ninguna de estas soluciones es realmente buena, así que se me ocurrió esto:
/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null
con esto, está enviando a
tar
solo los archivos que realmente existen en el momento de la ejecución del comando :no necesita preocuparse por sus nombres, o incluso qué archivo existe o no :usted siempre ejecute el mismo comando (sin importar qué ), escala perfectamente si falta 1 archivo, o n archivos faltantes, y no pierde ningún error.(tenga en cuenta la barra invertida si está delante de
ls
comando :de esta manera, evita cualquier aliasls
, por lo tanto, su salida es más confiable)