![在 n 个文件后获取大量文件的文件大小失败](https://linux22.com/image/120367/%E5%9C%A8%20n%20%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8E%E8%8E%B7%E5%8F%96%E5%A4%A7%E9%87%8F%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F%E5%A4%B1%E8%B4%A5.png)
我试图找出如何处理处理大文件列表的问题。
我有 2000 多个文件的列表。当我尝试使用 ls 或 wc 将它们放入循环中以获取每个文件的文件大小时,在 n 个文件之后, ls/wc 失败。看来如果我每 3-4 个文件暂停 2 秒,ls/wc 就可以工作。
为了使问题更加复杂,我还使用 rsh 在远程服务器上运行它,以便我可以比较 server1 和 server2 上的文件大小。但是,当我不使用 rsh 时,我在本地也确实遇到了问题,但它在开始失败之前会遍历更多文件列表。
server="xy1"
for CompareList in `cat compare_jnj.txt`
do
rsh $server wc -c /u2/web/$CompareList.java |awk '{print " ",$1," ",$2}'|tr -s " " >> output.out
rsh $server wc -c /u2/web/$CompareList.class |awk '{print " ",$1," ",$2}'|tr -s " " >> output.out
done
我的文件列表是不带文件扩展名的文件位置/名称的静态列表。出于安全原因,我已经删除了很多我在其中所做的事情,但这显示了我正在使用的循环/命令:
那是在我使用 ls -l 编辑它以获取要导出到结果集的文件名/大小之后
答案1
听起来您的脚本正在解析ls
(或wc
) 的输出只是为了获取文件名列表。不要这样做;这是一个非常糟糕的主意。
要获取简单的管道分隔的文件名列表及其大小(以字节为单位),您可以使用:
stat -c '%n|%s' /path/to/directory/*
或者,解析目录树:
find /path/to/directory -type f -exec stat -c '%n|%s' "{}" \;
答案2
这是我通常针对目录树运行的命令来列出文件及其大小:
find <directory>/* -type f -print0 | xargs -0 -n1 du -h
您还可以按文件大小排序(我发现这对我的工作很有用):
find <directory>/* -type f -print0 | xargs -0 -n1 du -h | sort -n -r