我正在尝试获取目录中找到的五个最大文件的总大小,但我无法让 du 处理我的列表。我有两种方法可以查找和排序五个最大文件。
#!/bin/bash
DIR=$1 #The starting directory path
if [ ! -d "$DIR" ]; then #if the directory is not found
echo "The directory doesn't exist!"
exit 1
fi
echo "Five largest files using ls are:"
test_ls=$( ls -lhR "$DIR" | grep '^-' | sort -r -k 5 -h | head -n 5 )
du -ch "$test_ls"
echo "Five largest files using find/DU are:"
test_find=$( find "$DIR" -type f -exec du -ch {} + | sort -rh | head -n 5 )
du -ch "$test_find"
echo "Total number of files: "
ls -lhR "$DIR" | grep '^-' | wc -l
echo "Total size of files: "
du -sh "$DIR" | awk '{print $1}'
如果我将 du 应用到 ls 变量上,我会得到:
du: invalid option -- 'r'
du: invalid option -- 'w'
du: invalid option -- '-'
du: invalid option -- 'r'
如果我将其应用于 find 变量,我会得到五个文件中的每一个
du: cannot access '429M': No such file or directory
ls 版本和 find 版本都可以很好地列出给定目录下的五个最大文件,但我真的不知道如何将它们的大小加在一起。
答案1
不确定如何最好地修复您的代码,我建议采用一种不同的方法,而不需要du
因为find
可以返回文件大小-printf '%s'
。
还要注意的是,你永远不应该解析ls
如果您不使用选项进行限制,则find
Unlike将会递归运行。ls
-maxdepth
这将找到目录中最大的五个文件并计算其大小总和:
find "$DIR" -maxdepth 1 -type f -printf '%s\n' | sort -nr | head -n5 | paste -sd+ | bc | numfmt --to=iec
find ... -printf '%s\n'
将以字节为单位打印文件大小| sort -nr | head -n5
将找到五个最大的数字| paste -sd+
会用加号连接数字,所以这是一个数学表达式| bc
将运行数学表达式| numfmt --to=iec
(可选)将大小从字节转换为人类可读的格式。
为了获取更多信息,您可以将find
输出保存在数组中:
DIR=/some/dir
file_sizes=($(find "$DIR" -maxdepth 1 -type f -printf '%s\n' | sort -nr))
num_files=${#file_sizes[@]}
total_size=$(IFS=+; echo "$((${file_sizes[*]}))" | numfmt --to=iec)
biggest_files=$(IFS=+; echo "$((${file_sizes[*]:0:5}))" | numfmt --to=iec)
printf 'Total number of files: %d\nTotal size of files: %s\nSize of biggest 5: %s\n' $num_files $total_size $biggest_files