Ecoar texto para vários arquivos usando localizar
-
27-10-2019 - |
Pergunta
Eu gostaria de adicionar algum texto simples em alguns arquivos.Especificamente, faço isso em drivers lpfc do Linux:
ls -1 /sys/class/scsi_host/host* | awk -F '@' '{system("echo 0x0 > "$1"/lpfc_log_verbose")}'
Mas pensando em casos comuns, preciso lidar com espaços nos nomes dos arquivos.Assim, virei para encontrar:
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec echo 0x0 > {} \; 2>/dev/null
Mas isso parece não funcionar.
find -L /sys/class/scsi_host -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec cat {} \; 2>/dev/null
está bem, mas mostra que minha edição não teve sucesso.Então, podemos usar o redirecionamento em find -exec?Qual é a solução alternativa correta?
Solução
Então, podemos usar redirecionamento em find -exec?
Não, porque o > {}
é manipulado pelo Bash antes de invocar find
.Tecnicamente, em vez de executar
find ... -exec echo 0x0 > {} ...
você poderia executar
find ... -exec bash -c 'echo 0x0 > {}' ...
mas acho que é mais simples de escrever:
for dir in /sys/class/scsi_host/host* ; do
echo 0x0 > "$dir"/lpfc_log_verbose
done
(que - não tema - lida com espaços e novas linhas e controla caracteres).
Outras dicas
Que tal isso -
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' |
while read -r filename; do
echo "0x0" > "$filename"
done
< Paulou
while read -r filename; do
echo "0x0" > "$filename"
done < <(find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose')
Como echo
é um shell built-in
, você não pode usá-lo diretamente com -exec
.No entanto, você pode fazer o seguinte -
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec sh -c 'echo "0x0" > {}' \;
Uma maneira fácil de fazer isso é ter o conteúdo to_be_written gravado em um arquivo temporário / fictício e usar cp
para copiar o conteúdo para o arquivo de destino, dentro de exec
cp
funciona bem e expandirá {}
dentro de -exec
enquanto echo / redirect não funciona
echo 1 > /tmp/dummy
find /sys/kernel/debug/tracing -name enable -exec cp /tmp/dummy {} \;