2012-01-12 53 views
2

我想在某些文件中添加一些簡單文本。具體地說,我做這在Linux上LPFC驅動程序:使用find在多個文件中回顯文本

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中使用重定向嗎?什麼是正確的解決方法?

回答

8

所以我們可以使用重定向找到-exec?

不會,因爲> {}被猛砸調用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 

(其中—不要害怕—並處理空格和換行和控制字符)。

+0

偉大的我應該相信殼。在這種情況下,我會堅持awk ... – MeaCulpa 2012-01-12 05:49:02

5

這個怎麼樣 -

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') 

由於echoshell built-in你不能直接用-exec使用它。但是,你可以做以下 -

find -L /sys/class/scsi_host -nowarn -maxdepth 2 -type f -name 'lpfc_log_verbose' -exec sh -c 'echo "0x0" > {}' \; 
+1

兩個小點:(1)你的前兩個例子不會包含新行名工作; (2)存在一個名爲'echo'的shell,但是正是出於這種原因,大多數系統(包括OP)在路徑中都有一個幾乎相同的'echo'程序。 – ruakh 2012-01-12 01:36:14

+0

感謝您的反饋@ruakh。 – 2012-01-12 01:54:50

1

最簡單的方式做到這一點,是有to_be_written內容寫入臨時/虛擬文件並使用cp有複製到目標文件中的內容,裏面的exec

cp效果很好,而且將擴大{}-exec而回聲/重定向無法工作

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