Saltar al contenido principal

% 16k.es

Find, exec y redirecciones en bash

Es habitual la necesidad de lanzar comandos de este tipo: buscar una serie de ficheros y, una vez encontrados, escribir en cada uno de ellos determinada cadena. Un ejemplo práctico sería buscar los ficheros scheduler para dispositivos de disco y escribir en ellos el nombre del elevator deseado.

bash

Lo que pide el cuerpo es hacer algo así:

find /sys/block/sd*/queue -maxdepth 1 -name scheduler \
  -exec echo "noop" > {} \;

Algo no cuadra, ¿verdad? Esa redirección no tiene buena pinta. De hecho, lo más probable es que terminemos con un fichero de nombre “{}” en el directorio actual con tantas líneas “noop” como dispositivos encontrados

Hay varias alternativas pero la más sencilla es la siguiente:

find /sys/block/sd*/queue -maxdepth 1 -name scheduler \
  -exec sh -c 'echo "noop" > {}' \;  

La redirección se interpretará correctamente y obtendremos el resultado deseado.