Эхо-текст для нескольких файлов с помощью поиска - PullRequest
4 голосов
/ 12 января 2012

Я хотел бы добавить простой текст в некоторые файлы. В частности, я делаю это на драйверах Linux lpfc:

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

Но, думая об общем случае, мне нужно обрабатывать пробелы в именах файлов. Таким образом я обернулся, чтобы найти:

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

Но это, похоже, не работает.

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

хорошо, но показывает, что мое редактирование не увенчалось успехом. Так можем ли мы использовать редирект в find -exec? Какой правильный обходной путь?

Ответы [ 3 ]

12 голосов
/ 12 января 2012

Так можем ли мы использовать перенаправление в find -exec?

Нет, потому что > {} обрабатывается Bash перед вызовом find.Технически, вместо запуска

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

вы можете запустить

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

, но я думаю, что проще написать:

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

(что - не бойтесь - делаетобрабатывать пробелы и символы новой строки и управляющие символы).

5 голосов
/ 12 января 2012

Как насчет этого -

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

или

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

Поскольку echo является shell built-in, вы не можете использовать его напрямую с -exec. Тем не менее, вы можете сделать следующее -

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec sh -c 'echo "0x0" > {}' \;
2 голосов
/ 13 апреля 2015

Простой способ сделать это - записать содержимое to_be_written во временный / фиктивный файл и использовать cp для копирования содержимого в конечный файл, внутри exec

cp работаетхорошо, и будет расширяться {} внутри -exec, в то время как эхо / перенаправление не работает

echo 1 > /tmp/dummy
find /sys/kernel/debug/tracing -name enable -exec cp /tmp/dummy {} \;
...