這為我提供了所有文字檔案的路徑列表:
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
所有其他欄位並僅列印檔案名