OSX bash以递归方式查找按大小排序的文件,文件夹除外

时间:2013-07-10 16:47:58

标签: macos bash file search file-listing

我遇到了以下命令,几乎做了我需要的事情:

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

现在,我不知道这意味着什么(会喜欢解释,但不是那么重要)。

我需要添加的一件事是不要打扰特定的文件夹(即我有一个包含数万个Word文档的Documents文件夹,这使得这个命令需要很长时间)。

有人可以建议添加上面的命令,找不到给定的文件夹吗?

3 个答案:

答案 0 :(得分:5)

*/Documents/*中排除与find匹配的路径:

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

答案 1 :(得分:5)

既然你要求解释......

find . -type f -print0

这是find实用程序,它通过文件系统找到符合您想要的内容。 .本质上意味着它会尝试查找任何内容,但由于您指定-type f,它只会找到“常规文件”。您可能已经猜到,-print0只是打印标准输出的完整路径(对于管道非常有用)。它在每一行的末尾使用一个空字符(而不是-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等),数字排序可能会造成混淆。

答案 2 :(得分: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

您也可以使用Finder: