2013-07-10 49 views
2

我碰到下面的命令,這做什麼,我需要:OSX bash的遞歸找到大小排序的文件除了在文件夾

find . -type f -print0 | xargs -0 ls -l | sort -k5,5rn > ~/files.txt

現在,我沒有什麼線索任何這意味着(會喜歡解釋,但不是那麼重要)。

我需要添加的一件事就是不要打擾特定的文件夾(即我有一個文檔文件夾與成千上萬的Word文檔,這使得這個命令需要很長的時間10s)。

任何人都可以建議除了上面的命令,會發現忽略給定的文件夾?

回答

5

排除匹配*/Documents/*路徑從find

find . -type f ! -path "*/Documents/*" -print 0 | ... 
+0

非常感謝!勞裏的答案是徹底的,但你的回答正是我問到的問題的答案。 – Dave

1

不同的期權或其他方式找到大文件:

  • find ~ -size +100M ! -path ~/Documents\* ! -path ~/Library\*
  • find ~ -size +100M | grep -v "^$HOME/Documents/" | while IFS= read -r l; do stat -f'%z %N' "$l"; done | sort -rn
  • shopt -s extglob; find ~/!(Documents) -type f -exec stat -f'%z %N' {} \; | sort -rn | head -n200
  • mdfind 'kMDItemFSSize>=1e8&&kMDItemContentTypeTree!=public.directory' | while IFS= read -r l; do stat -f'%z %N' "$l"; done | sort -rn

您也可以只使用搜索工具:

+0

不幸的是,它是一個USB硬盤,上面有VHD磁盤映像,通過Parallels安裝。 Finder不顯示任何結果。如果我等了很久,也許會這樣,但沒有任何進展跡象。 – Dave

5

既然你問了一個解釋......

find . -type f -print0 

這就是find工具,它通過文件系統傳播找到符合你想要的東西。 .本質上意味着它會嘗試找到任何東西,但是由於您指定了-type f,它只會找到「常規文件」。正如您可能已經猜到的那樣,只需打印標準輸出的完整路徑(對管道有用)。它在每行的末尾使用空字符(而不是-print,這將在短時間內相關)。

xargs -0 ls -l 

xargs需要從標準輸入事情的清單,然後利用什麼傳遞給它作爲參數執行給定的命令(「工具」)。在這種情況下,該實用程序是命令ls -l,因此xargs從find獲取結果並在其上執行ls -l,爲您提供長而完整的路徑;這基本上只是一種將文件列表轉換爲大小等信息的文件列表的方法。 -0選項允許xargs將空字符解釋爲行之間的分隔符,它們幾乎存在(幾乎?)以允許它與上面的-print0選項一起使用。

sort -k5,5rn > ~/files.txt 

sort很酷。它排序的東西。 -k告訴它要排序的列,在這種情況下是列5(僅列5)。 rn位表示使用數字排序並顛倒順序。底部的默認值是最大的,所以這首先是最大的。如果使用ls -lh使用單位後綴(B,K,M,G等),則數字排序可能會引起混淆。