Echo texte à plusieurs fichiers en utilisant find
-
27-10-2019 - |
Question
Je voudrais ajouter un texte simple dans certains fichiers. Plus précisément, je le fais sur Linux lpfc pilotes:
ls -1 /sys/class/scsi_host/host* | awk -F '@' '{system("echo 0x0 > "$1"/lpfc_log_verbose")}'
Mais la réflexion sur le cas commun je dois espaces de poignée dans les noms de fichiers. Ainsi, je me suis tourné pour trouver:
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec echo 0x0 > {} \; 2>/dev/null
Mais cela ne semble pas fonctionner.
find -L /sys/class/scsi_host -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec cat {} \; 2>/dev/null
est bien, mais montre mon édition n'a pas le succès. Alors, peut-on utiliser Rediriger à trouver exec? Quel est le travail autour correct?
La solution
Alors peut-on utiliser Rediriger à trouver exec?
Non, parce que le > {}
est géré par Bash avant d'appeler find
. Techniquement, au lieu de courir
find ... -exec echo 0x0 > {} ...
vous pouvez exécuter
find ... -exec bash -c 'echo 0x0 > {}' ...
mais je pense qu'il est plus simple d'écrire:
for dir in /sys/class/scsi_host/host* ; do
echo 0x0 > "$dir"/lpfc_log_verbose
done
(qui - ne craignez pas - ne les espaces de poignée et sauts de ligne et les caractères de contrôle).
Autres conseils
Qu'en est-ce -
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' |
while read -r filename; do
echo "0x0" > "$filename"
done
ou
while read -r filename; do
echo "0x0" > "$filename"
done < <(find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose')
Depuis echo
est un shell built-in
vous ne pouvez pas l'utiliser directement avec -exec
. Cependant, vous pouvez effectuer les opérations suivantes -
find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec sh -c 'echo "0x0" > {}' \;
An easy way to do this, is to have the to_be_written content written to a temporary/dummy file and use cp
to have the content copied to the destination file, inside exec
cp
works well, and will expand {}
inside -exec
while echo/redirect fails to work
echo 1 > /tmp/dummy
find /sys/kernel/debug/tracing -name enable -exec cp /tmp/dummy {} \;