Usa el -T
característica de tar para indicarle que lea la lista de archivos de otro archivo (tar trata cada línea como un archivo separado).
A continuación, puede utilizar <()
notación para que su shell genere un pseudo-archivo a partir de la salida de un comando:
tar cf ctlfiles.tar -T <(find /home/db -name "*.ctl")
Si su shell no es compatible con <()
notación, puede usar un archivo temporal:
find /home/db -name "*.ctl" > ctlfile-list
tar cf ctlfiles.tar -T ctlfile-list
rm ctlfile-list
Puede usar la función -print0 de find con la función -0 de xargs, así:
find /home/db -name '*.ctl' -print0 | xargs -0 tar -cf ctlfiles.tar
-print0 (eso es guión-impresión-cero) le dice a find que use un valor nulo como delimitador entre rutas en lugar de espacios, y -0 (eso es guión cero) le dice a xargs que espere lo mismo.
Editado para agregar:
Si tiene una gran cantidad de archivos, xargs puede invocar tar más de una vez. Vea los comentarios para conocer las formas de lidiar con eso, o haga que find invoque tar directamente, como este, que funciona con cualquier cantidad de archivos, incluso si tienen espacios o saltos de línea en sus nombres:
rm -f ctlfiles.tar
find /home/db -name '*.ctl' -exec tar -rf ctlfiles.tar {} +
Cuando el argumento que sigue a "-T" es "-", la lista de archivos se toma de stdin. Las versiones recientes de tar suelen admitir la opción "-null", que indica que los archivos proporcionados en la fuente especificada por "-T " Las opciones están separadas por valores nulos.
Por lo tanto, lo siguiente funciona con un número arbitrario de archivos, que posiblemente contengan caracteres de nueva línea:
find /home/db -name '*.ctl' -print0 | tar --null -T - -cf ctlfiles.tar