題 找到| grep在Cygwin中不起作用


我安裝了cygwin,當我使用此命令搜索源代碼時,沒有任何顯示,即使我在文件中有該字符串

$ echo foo > bar
$ find . -name '*' | grep foo

什麼都沒有出現。這個命令在GNU + Linux上運行正常。

$ grep foo bar

4
2017-12-09 09:46


起源


也可以管道找到xargs,如 $ find . | xargs grep foo - Xen2050
@ Xen2050你可以補充一下作為答案,我忘了xargs。 - jcubic
@jcubic你不需要使用 find 一點都不看到我的回答。 - DavidPostill♦
出於好奇,有什麼用 $ which find 回歸Cygwin? - SΛLVΘ
@SalvoF /usr/bin/find - jcubic


答案:


如上所述,find將輸出的文件列表輸出到stdout,如果以這種方式調用,grep通常希望搜索stdout。

也可以管道找到 xargs,它會“從標準輸入構建和執行命令行“,如同

$ find . | xargs grep foo

如果你有瘋狂的文件名,有換行符和諸如此類的東西,那麼這會更好:

$ find . -type f -print0 | xargs -0 grep foo

-type f 只會找到常規文件,所以沒有嘗試grep通過任何 . 要么 .. 或任何目錄或“有趣”的文件。


3
2017-12-09 11:40



這是混亂的輸出(線條像 grep: .: Is a directory  和 grep: ./test: Is a directory。您可以考慮添加 --exclude-dir=* 至 grep。或者只是使用 grep --exclude-dir=* "foo" ./* 根據我的回答;) - DavidPostill♦
@DavidPostill我打算添加 -type f 在那裡標記,我總是在這些情況下使用它,但我在問題和其他答案中堅持使用一般格式。我會添加它 - Xen2050


find . -name  '*' # This will produce a list of *file names*

然後,您將文件名列表傳遞給 grep 在stdin上,它將列表視為文本並進行搜索 foo

你沒有文件名 foo 所以什麼都不返回。

要遞歸搜索文件中查找文本的文件,您只需使用即可

grep -R foo somefolder/

9
2017-12-09 10:03



找到| grep在linux上工作 - jcubic
@jcubic如果你的命令 find . -name '*' | grep foo 在find命令列出的文件中找到單詞foo,然後你的Linux壞了,你應該提交一個bug。 - stedotmartin
@stemartin我有一個理論:最近的GNU grep + alias grep="grep -r" 你得到了這種行為,因為GNU Coreutils開發人員以他們的智慧決定了這一點 grep -r 在STDIN沒有任何意義,而是我們將默默地修復它以grep當前目錄。我個人認為這種行為是一個主要的錯誤。 - oals


當我使用此命令搜索源代碼時,沒有顯示任何內容

$ echo foo > bar
$ find . -name '*' | grep foo

find 搜索符合所需條件的文件名:名稱,大小,文件類型並返回匹配文件名列表。它沒有返回 內容 匹配文件。

傳遞該文件名列表時 grep 使用管道操作員 grep 會看到字符串 bar (文件名)和   foo (文件的內容 bar)。

grep 因此沒有找到匹配因此無法輸出。

注意:

  • grep 可以直接搜索文件。你不需要使用 find。管道 |, 要么 xargs 如另一個答案所示。

以下命令適用於Cygwin:

grep --exclude-dir=* "foo" ./*

例:

DavidPostill@Hal /f/test
$ cat bar
foo

DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo

進一步閱讀

  • Linux的Bash命令行的A-Z索引  - 與Bash命令行相關的所有內容的出色參考。
  •   - 在文件夾層次結構中搜索符合所需條件的文件名:名稱,大小,文件類型。
  • grep的  - 搜索特定文本的文件。

2
2017-12-09 10:17





我想你想要這個。

find . -name '*' -type f -exec grep foo /dev/null {} \;

您只想要grep文件,而不是目錄或特殊文件。 / dev / null使grep顯示文件名。您可能想要刪除'-name'*',但如果這樣做,那麼點文件將被刪除。

你也可以跑

grep -r foo .

0
2017-12-09 15:14



你的第一個命令比我的解決方案慢得多 grep --exclude-dir=* "foo" ./* 產生相同的輸出。 - DavidPostill♦
grep -r foo . 可以縮短為 grep -r foo - DavidPostill♦
@DavidPostill僅適用於最新版本的GNU grep。這是腦死亡行為恕我直言。 - oals
@oals哦。我不知道。謝謝。 - DavidPostill♦