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?

Foi útil?

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 {} \;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top