2012-12-15 46 views
6

我需要編寫寫入選定目錄中的每個文件的腳本,這些文件大於某個大小。此外,我需要按大小,名稱和上次修改日期對它們進行排序。如何查找大於一定大小的文件,並按上次修改日期對它們進行排序?

所以我做了前兩種情況:

按大小

RESULTS=`find $CATALOG -size +$SIZE | sort -n -r | sed 's_.*/__'` 

按名稱排序

RESULTS=`find $CATALOG -size +$SIZE | sed 's_.*/__' | sort -n ` 

但我不知道如何排序結果到最後修改日期。

任何幫助,將不勝感激。

+0

也看到中超[我怎樣才能找到那些大文件/比x字節小?(http://superuser.com/q/204564/173513)用戶。 – jww

+0

我實際上在這個問題中發現了一個問題的答案(查找超過一定大小的文件) - 謝謝:-) – markc

回答

11

如果您沒有太多文件,最好的方法之一就是使用ls來進行自我排序。

按名稱和打印每行一個文件:

find $CATALOG -size +$SIZE -exec ls -1 {} + 

按大小和打印每行一個文件:

find $CATALOG -size +$SIZE -exec ls -S1 {} + 

排序修改時間和打印每行一個文件:

find $CATALOG -size +$SIZE -exec ls -t1 {} + 

你也可以玩ls開關:按修改時間排序(小先)w第i個長列表格式,人類可讀的大小:

find $CATALOG -size +$SIZE -exec ls -hlrt {} + 

哦,你可能只想find文件(而忽略目錄):

find $CATALOG -size +$SIZE -type f -exec ls -hlrt {} + 

最後,一些言論:避免資本變量bash中的名字(這被認爲是不好的做法),並避免反撥,請使用$(...)。例如,

results=$(find "$catalog" -size +$size -type f -exec ls -1rt {} +) 

此外,你可能不希望把所有的結果放在像上一行一樣的字符串中。你可能想把結果放在一個數組中。在這種情況下,使用mapfile這樣的:

mapfile -t results < <(find "$catalog" -size +$size -type f -exec ls -1rt {} +) 
+0

謝謝,非常有幫助和詳盡的答案。 –

+1

我總是想知道如果可以使用locate命令代替find,它可能會很酷。作爲一個經驗法則,它的工作速度比發現要快得多。不幸的是,它沒有「-exec」選項( – Tebe

1

嘗試xargs(做任何事情,將STDIN視爲參數列表)和-t-r標誌爲ls。 即是這樣的:

find $CATALOG -size +$SIZE | xargs ls -ltr 

這將會給你的最後修改日期排序的文件。我認爲你需要使用一種腳本語言(ruby,perl,php,不管),除非你的shell fu()函數和多個屬性一起進行排序會非常不方便。強。

相關問題