我有一個用於清理資料檔案的腳本
命令:
for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`
我嘗試在沒有該功能的情況下運行該命令grep -v
,但沒有發現任何差異。
我想知道它的grep -v "^.$"
作用是什麼。我沒有創建這個腳本,而且我在網上找不到任何東西。
答案1
grep -v "^.$"
將列印輸入中的所有行,除了那些只有單一字元的行。
因為它用於:
find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"
我們可以假設它是從的輸出中丟棄當前工作目錄(.
) (使用相對路徑時顯示),這可以透過選項輕鬆實現,儘管這裡它是多餘的,因為您在 中使用絕對路徑。find
.
-mindepth 1
find
稍後您只搜尋data-
名稱中帶有 的文件grep data-
,這也是多餘的。您可以將所有邏輯放在一次find
呼叫中:
find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print
也刪除-print
,這是預設操作:
find /ddomain/data/shop12/ -name '*data-*' -mtime +15
請注意,如果您只查找文件,-type f
也請新增:
find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15
答案2
正如其他人已經說過的,grep -v '^.$'
過濾掉僅由一個字元組成的行(由行開頭 ( ^
) 後跟一個字元 ( .
) 後跟行結尾 ( $
) 組成的行。另一種編寫方式是grep -vx .
其中,-x
使^
和$
隱式(.
整行匹配)。
關於輸出:
find /ddomain/data/shop12/ -mtime +15 -print
這沒有什麼意義,因為該命令的輸出find
通常由以下行組成:
/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...
該輸出包含單一字元的行的唯一方法是如果存在名稱類似於foo<newline>X<newline>
.這是完全有可能的,但我想說這不太可能是該命令的意圖。
該命令可能(錯誤地)改編自:
find . -mtime +15 -print | grep -v '^.$' | grep data-
其grep
目的是過濾掉.
條目(即使如此,grep -Fvx .
也會更合適)。然而,這樣寫會更有意義:
find . ! -name . -path '*data-*' -mtime +15
如果你想用 過濾掉頂級目錄find /ddomain/data/shop12/
,你可以這樣做:
find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15
或者,如果您的find
實作支援-mindepth
謂詞:
find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15
答案3
.
它從結果清單中刪除該目錄find
。透過一個例子更容易解釋:
find . -print
.
./prova2
./prova2/prova2
find . -print | grep -v '^.$'
./prova2
./prova2/prova2
正如您所看到的,在第一個程式碼片段中,我們找到了.
結果。因此,您將其傳遞給循環所採取的操作for
。在第二個片段中,您決定從 的結果中
跳過該目錄,因此您不會將其發送到循環。.
find
for
答案4
grep -v '^.$'
排除只有一個字元的行。
例子:
echo "foo
> bar
> x" | grep -v '^.$'
foo
bar