2012-08-16 81 views
0
find /ABC/ \ 
    -type f \ 
    -exec \ 
    sh -c ' if [ echo "1" > ${1} ] ; then if [ "$(cat ${1})" != "1" ]; then [ echo ${1} ] ; fi ; fi ' _ {} \; 

我的劇本想做到這一點:殼牌括號和報價

找到文件夾中的所有文件。將1寫入文件。檢查「1」是否寫得不正確。打印此文件的名稱。

之前。我做了這2個步驟。 (1)寫(2)讀取檢查。 現在我將這兩個結合在一起。因爲我想在寫完一個文件後立即檢查。

但我的腳本現在有些問題。 需要幫助。 謝謝。 它給我的錯誤:

sh: 1: unknown operand 

我猜的東西是不匹配的/因爲我是如此無經驗的殼。需要你們幫助

+0

一個問題:爲什麼?!? – Annabelle 2012-08-16 00:32:39

+0

我正在操作的文件實際上就是註冊表。有人可能會影響其他人所以最好一個接一個地測試。 – 2012-08-16 00:33:20

+1

如果你想回顯未成功寫入的文件名爲什麼使用'then [echo $ {1}]'而不是'echo $ 1'? – 2012-08-16 00:40:06

回答

0

試試這個:

find . -type f -exec sh -c 'echo "1" >> "${1}"; if [ "$(cat ${1})" != "1" ]; then echo "${1}" ; fi' _ {} \; 

我沒有測試你的命令,因爲它並沒有從一開始看起來是正確的。

的幾個注意事項,但:

echo "1" > "${1}"會揍文件。如果要附加,請使用>>

[是一個命令(也稱爲test

then [ echo ${1} ]使用此測試不正確。你不需要在這裏進行測試。

你不需要if [ echo...,按照對方的回答,所以我拿瞭如果測試了這一點完全。

+0

謝謝。我明天再試。我想覆蓋文件。不想追加:) – 2012-08-16 01:49:16

1
if [ echo "1" > ${1} ] ; then 

[是一個普通的命令,它是在幾乎每一個sh一個內置在那裏,但它仍然正常解析。因此> ${1}的意思是「將輸出重定向到名稱作爲參數傳遞的文件」。如果要比較兩個號碼,使用-gt操作:

if [ 1 -gt "$1" ]; then … 

如果你想寫1到一個文件,使用echo命令,不[ … ]這是有條件的命令(下也可以被調用命名test):

if echo 1 >"$1"; then … 

注意,如果echo 1 >"$1"成功,則很可能是該文件將包含確實你放在那裏的文本。這是不會發生的唯一的時間是:

  • 如果$1是一個特殊的文件,如管道或設備(其將不會發生,因爲它們將不受-type f匹配);
  • 如果在一個特殊的文件系統上,你從文件中讀取的內容不是上次寫入的內容 - 這將是一個奇怪的文件系統,而不是磁盤存儲的文件系統;
  • 如果其他程序在此期間修改了文件,這不太可能是由於時間窗口小而不是不可能的。