Pregunta

Me gustaría agregar texto simple en algunos archivos.Específicamente, hago esto en controladores lpfc de Linux:

ls -1 /sys/class/scsi_host/host* | awk -F '@' '{system("echo 0x0 > "$1"/lpfc_log_verbose")}'

Pero pensando en el caso común, necesito manejar espacios en los nombres de los archivos.Así que me volví para encontrar:

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec echo 0x0 > {} \; 2>/dev/null

Pero esto parece no funcionar.

find -L /sys/class/scsi_host -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec cat {} \; 2>/dev/null

está bien, pero muestra que mi edición no se realizó correctamente.Entonces, ¿podemos usar la redirección en find -exec?¿Cuál es la solución alternativa correcta?

¿Fue útil?

Solución

Entonces, ¿podemos usar la redirección en find -exec?

No, porque > {} es manejado por Bash antes de invocar find.Técnicamente, en lugar de correr

find ... -exec echo 0x0 > {} ...

podrías correr

find ... -exec bash -c 'echo 0x0 > {}' ...

pero creo que es más sencillo escribir:

for dir in /sys/class/scsi_host/host* ; do
    echo 0x0 > "$dir"/lpfc_log_verbose
done

(que, no temas, maneja espacios, líneas nuevas y caracteres de control).

Otros consejos

¿Qué tal esto?

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' | 
while read -r filename; do
echo "0x0" > "$filename"
done

<

while read -r filename; do
echo "0x0" > "$filename"
done < <(find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose')

Dado que echo es un shell built-in, no puede usarlo directamente con -exec.Sin embargo, puede hacer lo siguiente:

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec sh -c 'echo "0x0" > {}' \;

Una manera fácil de hacer esto es escribir el contenido to_be_written en un archivo temporal / ficticio y usar cp para que el contenido se copie en el archivo de destino, dentro de exec

cp funciona bien y expandirá {} dentro de -exec mientras que echo / redirect no funcione

echo 1 > /tmp/dummy
find /sys/kernel/debug/tracing -name enable -exec cp /tmp/dummy {} \;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top