获取 Bash 中五个最大文件的总大小

获取 Bash 中五个最大文件的总大小

我正在尝试获取目录中找到的五个最大文件的总大小,但我无法让 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如果您不使用选项进行限制,则findUnlike将会递归运行。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

相关内容