Echo il testo su più file usando find
-
27-10-2019 - |
Domanda
Vorrei aggiungere del testo semplice in alcuni file.Nello specifico, lo faccio sui driver lpfc di Linux:
ls -1 /sys/class/scsi_host/host* | awk -F '@' '{system("echo 0x0 > "$1"/lpfc_log_verbose")}'
Ma pensando a casi comuni ho bisogno di gestire gli spazi nei nomi dei file.Così mi sono rivolto a trovare:
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec echo 0x0 > {} \; 2>/dev/null
Ma questo sembra non funzionare.
find -L /sys/class/scsi_host -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec cat {} \; 2>/dev/null
va bene ma mostra che la mia modifica non è riuscita.Quindi possiamo usare il reindirizzamento in find -exec?Qual è la soluzione corretta?
Soluzione
Quindi possiamo usare redirect in find -exec?
No, perché il > {}
viene gestito da Bash prima di invocare find
.Tecnicamente, invece di correre
find ... -exec echo 0x0 > {} ...
potresti correre
find ... -exec bash -c 'echo 0x0 > {}' ...
ma penso che sia più semplice scrivere:
for dir in /sys/class/scsi_host/host* ; do
echo 0x0 > "$dir"/lpfc_log_verbose
done
(che - non temere - gestisce gli spazi e le nuove righe e controlla i caratteri).
Altri suggerimenti
Che ne dici di questo -
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' |
while read -r filename; do
echo "0x0" > "$filename"
done
<$ o
while read -r filename; do
echo "0x0" > "$filename"
done < <(find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose')
Poiché echo
è un shell built-in
, non è possibile utilizzarlo direttamente con -exec
.Tuttavia, puoi fare quanto segue -
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec sh -c 'echo "0x0" > {}' \;
Un modo semplice per farlo è scrivere il contenuto to_be_written in un file temporaneo / fittizio e utilizzare cp
per copiare il contenuto nel file di destinazione, all'interno di exec
cp
funziona bene e espanderà {}
all'interno di -exec
mentre echo / redirect non funziona
echo 1 > /tmp/dummy
find /sys/kernel/debug/tracing -name enable -exec cp /tmp/dummy {} \;