按大小對所有文字檔案進行排序,產生路徑的文字列表

按大小對所有文字檔案進行排序,產生路徑的文字列表

這為我提供了所有文字檔案的路徑列表:

find / -type f -name '*.txt' > ~/Desktop/sorted.txt

我想根據每個項目的檔案大小對此路徑列表進行排序,但我不確定要使用什麼。這並不像我預期的那樣運作:

find / -type f -name '*.txt' |sort -S > ~/Desktop/sorted.txt

有什麼建議麼?

答案1

該命令wc對每個匹配檔案使用單獨的進程,因此其效能可能較差。我在創建它時考慮到了相容性和 POSIX 合規性。

find / -type f -name '*.txt' -exec wc -c {} \; | sort -t ' ' -n -k 1,1 | cut -d ' ' -f 2-

每個wc -c在表格中產生一行

12345 /path/to/file/possibly with spaces/foo.txt

其中第一個空格將位元組數與路徑分開。sort取得所有行,使用空格字元作為欄位分隔符,並根據第一個欄位(即根據位元組數)進行數字排序。然後cut使用空格字元作為欄位分隔符號並從第二個欄位開始列印,即除了第一個欄位之外的所有內容,即除了位元組計數(即路徑)之外的所有內容。

此解決方案可以輕鬆地適應按行數排序:只需使用wc -l而不是wc -c.


注意:
包含一個或多個換行符的路徑將破壞我的程式碼。為了使程式碼不受此影響,可以使用支援空字元作為分隔符號的工具。對於 POSIX 工具來說,如果可能的話,這是很困難的。這個答案集中於可移植性,因此希望文字檔案的所有路徑都是「好的」。

答案2

您始終可以採用將工具連結在一起的(可能不是最佳的)方法:

find / -type f -name '*.txt' -ls  | sort -nk7,7 | awk '{print $NF;}'
  • 尋找開關-ls將顯示許多額外的列,包括檔案大小(在 GNU 工具集上,第七列,在 MacOS 上可能有所不同)
  • 將對sort第七列(檔案大小)進行數字排序
  • 刪除awk所有其他欄位並僅列印檔案名

相關內容