¿Cuál es la diferencia entre xargs y exec?


Respuesta 1:

xargs lee desde stdin (usando espacios en blanco como entrega de tokens) y ejecuta comandos; para cada línea leída desde la entrada estándar, ejecuta un comando usando algún argumento inicial (opciones) seguido de los tokens leídos.

exec reemplazará el shell con otro proceso. Si está familiarizado con excel (), execv () y amigos, realmente lo hace.


Respuesta 2:

Principalmente se reduce a la cantidad de fork / clones que se ejecutan (eficiencia), pero también tiene implicaciones para los argumentos de los comandos. Tomemos este ejemplo.

buscar / etc -type f -print -exec stat

vs

find / etc -type f -print | estadística de xargs

Uno podría sentirse tentado a pensar que el primero es más eficiente porque si es un comando, pero no es así y aquí está el por qué. El primero ejecutará el comando "stat" para todos y cada uno de los archivos que se encuentran en / etc. Esto da como resultado una bifurcación / clon y un ejecutivo para cada archivo. El segundo agrupará un montón de nombres de archivos y los pasará al comando de estadísticas en grupos (puede cambiar la cantidad de archivos en un grupo con argumentos xargs). Esto da como resultado 1 / fork / exec llamadas donde es el número de argumentos de entrada que xargs decidió pasar a stat.

Limitación importante: si planea usar xargs con comandos que pueden aceptar solo un argumento, (mv, scp y rsync tienen algunas implicaciones interesantes aquí), entonces probablemente quiera hacer xargs -n 1, en cuyo caso quizás tenga utilizó -exec y tuvo el mismo resultado neto.

(vea también find. -print0 | xargs -0 si tiene espacios u otros caracteres originales en los nombres de sus archivos)