如何確定使用 grep、find 和 xargs 的不同指令是否執行相同的操作?

如何確定使用 grep、find 和 xargs 的不同指令是否執行相同的操作?

這三個指令做同樣的事情嗎?

  • 使用 grep 的指令。

    grep "a" -r .
    
  • 使用 find 的命令。

    find .  -exec grep "a" {} \;
    
  • 透過 xargs 查找時使用 grep 的命令。

    find . | xargs grep "a"
    

答案1

它們並不相同,每個人都有問題。

  • 第一個是不可移植的,因為它使用 Gnu 擴展。此外,選擇權預計位於形態之前,而非形態之後。
  • 如前所述,第二個不顯示檔案名稱。
  • 如果檔案名稱中嵌入了空格或類似內容,第三個將會失敗。

我會用:

find .  -type f -exec grep a /dev/null {} +

它是可移植的,它會忽略非常規文件,不會與奇怪的文件名稱衝突,並且在找到模式時始終顯示文件名。

答案2

這是家庭作業問題嗎?

你嘗試過嗎?

他們做的事情略有不同。

例如,如果您提供grep單一檔案名,它不會在輸出中回顯該檔案名稱。grep與 一起使用時,這可能會令人沮喪find

答案3

你應該更好地定義「做同樣的事情」。第一個執行一個命令,第二個運行一個find 並為每個找到的檔案執行一次fork+exec 的grep,第三個運行至少三個命令- 如果發現太多檔案無法放入一個命令行,則運行更多命令。就 CPU/記憶體影響而言,它們的影響最為明顯不是做同樣的事情 - 1 個、3 個和「一大堆」進程之間的差異是顯著的。

從檔案系統的角度來看,檔案系統被遍歷,每個檔案被統計,然後開啟、完全讀取和關閉。因此,從這個角度來看,它們都做同樣的事情,而且檔案系統沒有註意到差異(除了由於分叉大量進程的開銷而導致第二個實例中的遍歷速度可能較慢之外)。

螢幕上的輸出有所不同,並且可以根據經驗確定這種差異,只需運行具有幾種不同的可能目錄結構的命令(一種明顯的方法是 redgrittybrick 提到的方法)。

由於差異字元的數量和語法錯誤的可能性,它們花費不同的打字時間。

等等。事情可以透過很多方式「不同」。 :)

相關內容