Text-Processing
列出在特定行不包含特定字元串的文件
我正在嘗試查找所有帶有副檔名的文件
.md
find . -type f -name "*.md"
然後我想過濾掉那些第二行(行號= 2)不包含這個確切的字元串開頭和結尾的文件
author: Mr. Xab Ycd
我該怎麼做第二部分?這樣做
grep
會效率低下,因為它會檢查整個文件。
find . -type f -name '*.md' -exec \ sh -c 'sed 1d\;q "$1" | grep -qvx "author: Mr. Xab Ycd"' sh {} \; -print
上述命令包含所有要求,而無需通過 shell 管道傳遞可能令人困惑的文件名。
第一部分是(幾乎)從您的原樣複製的 - 查找名為
*.md
. 我已將雙引號更改為“硬”單引號;您的情況沒有功能差異,但是如果您想查找名為的文件,*.$md
則雙引號將嘗試擴展變數$md
.匹配的文件名然後通過另一個測試通過
-exec
. exec 的參數是一個小的 shell 腳本,它的作用是確定給定文件名在$1
. 該sed
命令僅列印第二行;有不同的方法可以做到這一點,例如:
sed -n '2{p;q;}'
或者sed '1d;q
第一個說“預設情況下不列印行,但是當你看到第二行時,列印它然後退出”。第二個說“預設列印行,但刪除第一行,然後退出(在第二行);該
q
命令將在退出之前列印目前緩衝區。該行文本(如果有)被傳遞給 grep,grep 檢查整行是否匹配(或不匹配)給定文本。如果不匹配 (
-v
),則整個命令成功並因此find
列印文件名。