將 find 與 sh - 指令一起使用不起作用

將 find 與 sh - 指令一起使用不起作用

我正在嘗試搜尋具有 pattern 的文件FW。我試圖從這些過濾的文件中搜尋模式chmod.*archive|archive.*chmod,然後列出它們。

我嘗試使用以下命令,但它沒有給我所需的輸出。需要幫助來解決這個問題。

find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more

答案1

如果我理解正確的話,你所需要的只是:

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

這將為grep找到的每個文件中的模式提供幫助find,如果grep成功,將以類似於 的格式列出該文件ls -l

答案2

作為 @terdon 建議的替代方案,您也可以使用以下命令:

grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW

編輯

正如@Kusalananda 指出的:

如果您的檔案位於名稱中包含 FW 的目錄中,則此操作將會失敗(給予錯誤的輸出)。

調整它使其正常工作會使其可讀性大大降低。 @terdon 提出的解決方案是一個更有利的選擇(也更有效 - 請參閱@tedron 的評論)。

不過,這裡有一個更正的版本:

grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'

答案3

您有兩個選項來取得與包含與您的模式相符的行的檔案相對應的路徑名稱:

  1. find輸出路徑名:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    這會grep單獨在每個找到的文件上運行,然後列印包含模式匹配項的每個文件的路徑名(順便說一句,我將其轉換為兩個獨立的基本正則表達式的標準兼容集,因為答案中的其他所有內容都是標準的)。

    -exec如果您想對路徑名執行其他操作而不僅僅是在終端中列印它們(只需添加更多操作),這可能是您想要使用的。

  2. grep輸出路徑名:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    grep在批量找到的文件上運行。該實用程式將根據其(“dash-ell”)選項grep報告每個符合檔案的路徑名。-l

    這可能會運行得更快,因為它最大限度地減少了呼叫次數grep,如果您只想在路徑名處。

相關內容