2016-12-24 60 views
1

因此,我試圖對大量文件執行批處理,但我希望批處理先從最小的文件開始。我需要做的是按升序獲取所有文件名,按文件大小排序。我見過一些例子,但一個問題是一些文件名包含空格,連字符,下劃線和其他特殊字符,所以我找不到任何適合我的東西。在BASH中按文件大小順序列出文件名

回答

6

ls -rS會做的伎倆。該名男子頁詳細解釋:http://man7.org/linux/man-pages/man1/ls.1.html

+1

這將不會處理它們之間存在空間的文件,正如問題所示。 – Inian

+3

@Inian爲什麼不呢? 'ls'將用空格處理文件,回車完美;我看到的* only *問題在於,OP打算將這個輸出用作腳本的輸入 - 但是您的答案並不能爲此提供解決方案。 –

0

find . -type f -print0 | xargs -0 wc -c | sort -n

上面的例子列出了大小的升序當前目錄下的文件。 find命令的參數-print0指示它使用null '\0'字符而不是空格作爲搜索結果之間的分隔符。在管道的另一端,-0參數準備xargs命令來做同樣的事情。這將處理文件名中的空白字符作爲普通字符。

+0

'發現。 -type f -exec wc -c {} + | sort -n'是一個更符合POSIX標準的更高效的替代方案('-print0'不是)。但是,問題在於'wc'具有多於1個文件名參數,以' total'形式打印彙總行,您需要將其過濾掉。請注意,對於大量的輸入文件'wc'可能會被多次調用(如果不是所有的文件名都適用於單個命令行),這使得對彙總行進行過濾變得更加棘手,尤其是因爲可能存在名爲'total'的_files_。 – mklement0

1

如果:

  • 你不擔心與嵌入式換行符文件名和
  • 你並不需要實際的文件大小,只是底層文件大小排序的文件名,

然後K. Matthews' answer應該爲你工作。

否則,假設你有GNU公用事業:

find . -mindepth 1 -maxdepth 1 -type f -printf '%s\t%f\0' | 
    sort -zn -k1,1 | 
    while read -r -d '' size name; do echo "[$size] [$name]"; done 

-mindepth 1 -maxdepth 1限制匹配直接位於.文件,類似於ls(雖然隱藏文件總是包括在內)。忽略整個子樹中的處理文件。

while循環示出了進一步處理由find-printf '...\0'sort -z產生的NUL封端的輸出的一種方法。
使用awk -F'\t' -v RS='\0' ...是另一種。

注意find-printfsort-z是非標準的,GNU的特定擴展,如使用'\0'作爲RS值與awk