Hacer eco de texto en varios archivos usando buscar
-
27-10-2019 - |
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?
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 {} \;