
我想將命令的輸出重定向find
到cat
命令,以便我可以列印給定檔案的資料。
例如,如果 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