Question

I'd like to add some simple text into some files. Specifically, I do this on Linux lpfc drivers:

ls -1 /sys/class/scsi_host/host* | awk -F '@' '{system("echo 0x0 > "$1"/lpfc_log_verbose")}'

But thinking about common case I need to handle spaces in file names. Thus I turned to find:

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec echo 0x0 > {} \; 2>/dev/null

But this seems not working.

find -L /sys/class/scsi_host -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec cat {} \; 2>/dev/null

is fine but shows my edit didn't success. So can we use redirect in find -exec? What is the correct work-around?

Was it helpful?

Solution

So can we use redirect in find -exec?

No, because the > {} is handled by Bash before invoking find. Technically, instead of running

find ... -exec echo 0x0 > {} ...

you could run

find ... -exec bash -c 'echo 0x0 > {}' ...

but I think it's simpler to write:

for dir in /sys/class/scsi_host/host* ; do
    echo 0x0 > "$dir"/lpfc_log_verbose
done

(which — fear not — does handle spaces and newlines and control characters).

OTHER TIPS

How about this -

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' | 
while read -r filename; do
echo "0x0" > "$filename"
done

or

while read -r filename; do
echo "0x0" > "$filename"
done < <(find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose')

Since echo is a shell built-in you cannot use it directly with -exec. However, you can do the following -

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 {} \;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top