我有一个很大的目录,其中包含太多文件ls
。我的想法:使用以下内容:
find . -name * -exec wc -c < {} \; | sort | tail -n 1
问题:shell 将其解释为 ( find . -name * -exec wc -c
) < ( {} \;
) | ...
我需要 上的“<” < {}
,以避免将文件名显示到sort
.
我也尝试过
find . -name "*" -exec cat {} +| wc -c
然而,这似乎被解释为:( find . -name "*" -exec cat {}
) | ( wc -c
) ——所以它给出了所有文件组合的大小。
还有一个使用 du 的变体-- 然而,由于最大的文件可能仅相距几个字节,因此这仅显示一百万个 500 KB 大小的文件 -- 同样,对于 ls 来说太多了。
答案1
要打印最大的文件(大小以千字节为单位),LS方法:
ls -S1s --block-size=K | sed -n '2{p;q;}'
-S
- 按文件大小排序,最大的在前-s
- 以块为单位打印每个文件的分配大小-1
- 每行列出一个文件sed -n '2{p;q;}'
- 输出中的第一行ls
是带有大小的行total
(例如total 388K
)。第二行是包含最大文件及其大小的行。该表达式将仅考虑第二个所需的行
答案2
假设您的文件名都不包含换行符 ( \n
),并且您有 GNU 实用程序,您可以使用此作为快速但肮脏的解决方案:
find . -maxdepth 1 -type f -exec stat --fmt $'%s\t%n' {} + | sort -n | tail -1
-maxdepth 1
如果您有必须包含在搜索中的子目录,请将其删除。如果您find
不支持终止符,+
您可以将其替换为效率较低的终止符\;
。'%s'
如果您不想输出文件名,请将格式字符串更改为 just 。
如果您的文件名中包含非打印字符,则可以使用此较慢的变体:
find . -maxdepth 1 -type f -exec stat --printf "%s\t" {} \; -print | sort -n | tail -1
-print
如果您确实不想要文件名输出,请删除。
对于 OSX,我认为你可以使用这样的命令,但我没有简单的方法来测试它。-print
如果您不需要文件名输出,请删除:
find . -maxdepth 1 -type f -exec stat -f '%z' -n {} \; -print | sort -n | tail -n 1