簡體   English   中英

哪個更有效:ls -l * ABC * vs ls -l | grep ABC

[英]Which is more efficient : ls -l *ABC* vs ls -l | grep ABC

至少有兩種方法可以執行相同的操作:) ls -l *ABC*ls -l | grep ABC ls -l | grep ABC

但是哪個更有效? 還有其他更有效的方法嗎?

他們做了兩件事。

ls -l *ABC*列出當前目錄中名稱包含ABC所有條目(而不以.開頭)。

ls -l | grep ABC ls -l | grep ABC列出了當前目錄中名稱不以開頭的所有條目. 然后過濾掉所有不包含ABC

ls -l列出了用戶名和組名以及文件名,因此,如果碰巧一個名稱包含ABC的用戶或組擁有的文件,則將列出這些文件,而不管其名稱如何。 大多數組名和用戶名都不包含大寫字母,但這不是一個嚴格的要求,您將希望對其他模式(例如abc執行相同的操作。 如果該模式恰好包含在單詞total ,則將匹配ls -l輸出的第一行。

更晦澀的是,文件名可以合法地包含/以外的任何字符以及空字符-包括換行符。 使用這樣的名稱確實不是一個好主意,但是這樣的文件名稱將在兩行或更多行中列出,並且grep在一行上進行操作。

ls -l的輸出旨在使人可讀。 它並不是真正要自動處理的。

ls -l *ABC*更清楚,直接地說明您的意思。 在考慮性能之前先考慮一下。 除非當前目錄肯定很大,否則任何性能差異都可能會被打印輸出所花費的時間所淹沒。

說了這么多,讓我們看一下可能的性能問題。

ls -l *ABC**ABC*通配符由外殼處理; ls僅看到參數列表。 它要求外殼程序掃描當前目錄並構建與模式匹配的文件名的排序列表。 然后, ls命令將再次對它排序(並且取決於您的shell和區域設置,我不確定兩種排序都將產生相同的順序)。 對於很大的目錄,排序可能是性能問題。 (解決方案:避免建立非常大的目錄。) ls排序的項目將比shell少-除非當前目錄中的所有內容都匹配*ABC*

ls -l | grep ABC ls -l | grep ABCls命令必須掃描當前目錄,對所有目錄進行排序,獲取所有內容的元數據,然后打印所有內容,以使(大部分)大部分內容由單獨的grep進程過濾掉。

我不知道哪個會更快。 它可能取決於當前目錄的內容。 但是除非您使用的是大型目錄或執行多次此操作,否則性能差異可能並不重要。 如果確實重要,請對其進行測量; 這是了解環境差異的唯一方法。

Glob vs Grep。

ls -l *ABC*工作方式是通配符匹配正則表達式,並填充與該正則表達式匹配的文件名數組。 一旦完成,ls就會以長-l格式列出文件。

ls -l | grep ABC ls -l | grep ABC使用linux管道。 管道的工作方式是將左命令的STD_OUT連接到右命令的STD_IN。 因此,ls -l首先生成長格式所有文件名的列表,然后通過管道將此列表傳遞給grep,grep根據其匹配的正則表達式過濾掉該列表。 現在,假設此列表包含一百萬個文件,那么當glob可以為您填充該列表時,就不必傳遞整個列表。

因此, ls -l | grep ABC ls -l | grep ABCls -l *ABC*慢得多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM