如何在“find”指令的輸出上使用“cat”指令?

如何在“find”指令的輸出上使用“cat”指令?

我想將命令的輸出重定向findcat命令,以便我可以列印給定檔案的資料。

例如,如果 find 的輸出是/aFile/readme那麼 cat 應該被解釋為cat ./aFile/readme。我怎樣才能立即做到這一點?

我必須使用管道嗎?

我嘗試過這個版本:

cat | find ./inhere -size 1033c 2> /dev/null

但我想這是完全錯誤的?當然,我確信輸出只是一個文件,而不是多個文件。

那我該怎麼做呢?我在谷歌上搜尋但找不到解決方案,可能是因為我沒有搜尋正確:P

答案1

您可以find單獨使用以下-exec操作來完成此操作:

find /location -size 1033c -exec cat {} +

{}將被替換為 找到的文件find,並且+使我們能夠在每次調用時讀取盡可能多的參數cat,因為cat可以採用多個參數。

如果您find沒有標準+副檔名,或者您想一一讀取檔案:

find /location -size 1033c -exec cat {} \;

如果您想使用 的任何選項cat,請執行以下操作:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

在這裡,我使用該-n選項來獲取行號。

答案2

命令替換

另一個選擇是使用命令替換。包裝命令$()將運行該命令並用其輸出替換該命令。

cat $(find ./inhere -size 1033c 2> /dev/null)

會變成

cat ./inhere/file1 ./inhere/file2 ./inhere/file3

這或多或少相當於使用帶有反引號的舊式包裝命令:

cat `find ./inhere -size 1033c 2> /dev/null`

來自上面鏈接的文檔的更多詳細信息

Bash 透過在子 shell 環境中執行命令並將命令替換替換為命令的標準輸出來執行擴展,並刪除所有尾隨換行符。嵌入的換行符不會被刪除,但它們可能會在分詞過程中被刪除。命令替換$(cat file)可以替換為等效但更快的命令$(< file)

當使用舊式反引號形式的替換時,反斜線保留其字面意義,除非後面跟著$`\。前面沒有反斜線的第一個反引號終止指令替換。使用該$(command)形式時,括號內的所有字元組成命令;沒有一個受到特殊對待。

命令替換可以嵌套。若要在使用反引號形式時進行嵌套,請使用反斜線轉義內部反引號。

如果替換出現在雙引號內,則不會對結果執行分詞和檔案名稱擴充。

這個另一個答案一些很好的用法範例。

答案3

這將僅遞歸地列印文字(ascii)檔案的名稱和內容。

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

再一次嘗試

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

答案4

使用管道和 xargs

find /* -name pg_hba.conf | xargs cat

如果因為權限不足而失敗,可以使用 sudo 來確保您有權限在要搜尋的目錄上執行 find 指令。

 sudo find /* -name pg_hba.conf | xargs sudo cat

相關內容