Como una nota:
evitar siempre, siempre xargs (1). Es una herramienta rota y solo es remotamente útil si la usa con la opción -0. Incluso entonces, casi siempre es mejor usar la opción -exec de find (1), o un bucle simple para o while.
¿Por qué es xargs tan malo? En primer lugar, divide la entrada en el espacio en blanco, lo que significa que todos los nombres de archivo que contienen el espacio en blanco causará estragos. En segundo lugar, es intenta para ser un listillo, y parse cotizaciones para usted. Lo cual solo lleva a más dolores de cabeza cuando lo usa en nombres de archivos que contienen citas como parte del nombre de archivo, como canciones: "No me quiero perder nada.mp3".Esto solo hará que xargs vomite y te maldiga cuando dices mal su entrada. No, no lo hizo: debería aprender que las cotizaciones no pertenecen a los datos de entrada, pertenecen a las secuencias de comandos de shell, y xargs no tiene nada que tratar de analizarlas.
Tenga en cuenta que xargs (1) no divide el espacio en blanco ni el análisis de comillas cuando pasa -0 a él. Hace lo correcto , que es utilizar bytes NULL para delimitar nombres de archivo. Pero eso significa que debe darle una entrada que use nombres de archivo NULL delimitados por bytes (como "find -foo -print0"). Lo cual nos lleva de vuelta a: es mejor usar find -exec: "find -foo -exec bar {} +".
cometí el error de hacer múltiples invocaciones de alquitrán antes, pensando al ponerlas en {...} | lzma ... funciona pero luego imprimiría el encabezado del tar nuevamente cada vez: p –
Excelente, esta es una solución perfecta; ¡Gracias! – jparanich
En caso de que alguien encuentre esto y no esté claro * cómo * funciona, '<(comando)' en bash crea un "descriptor de archivo nombrado" adjunto a la salida de 'comando'. Entonces, en este caso, 'tar' ve un argumento como' --files-from/dev/fd123', pero leer desde el "archivo" '/ dev/fd123' solo le da la salida de' find', sin la necesidad para un archivo temporal real. – IMSoP