我想编写一个脚本,该脚本将创建一个压缩存档文件,其中包含多个目录中超过特定阈值的最大文件。例如,我想知道如何取出 5 个大于 2MB 的最大文件并将它们放入名为largestfile.tar.gz
.这是我到目前为止所拥有的:
du -a $path | sort -n -r | head -n 5 > diskspacefile.txt
file=$(cat diskspacefile.txt)
while read p; do
filesize=echo $p | awk '{print $1 }'
if [ $filesize > 2000000 ]
then
zipfile=`echo $p | awk '{print $2 }'`
tar -zcvf largestfile.tar.gz $zipfile
fi
done
不幸的是,这似乎不起作用。当我运行它时,我要么在存档中只得到一个文件,要么根本没有文件。对于上下文,我感兴趣的目录是/root
和(即这些将是代码片段中变量/boot
的值)。path
答案1
首先,请注意,我们可以使用它find
来生成给定目录中所有大于 2MB 的文件的列表:
find . -type f -size +2M
我们想要从此列表中提取 5 个最大的文件。为此,我们可以使用该-printf
选项打印文件路径和文件大小(以字节为单位),如下所示:
find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n'
现在我们可以按文件大小(按降序)对这些结果以及此顺序列表中的前五个结果进行排序:
find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1
接下来我们删除文件大小来检索当前目录中最大的 5 个超过 2M 的文件的相对路径:
find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-
最后,我们可以将此文件路径列表传递给命令tar
,以便创建这些文件的压缩存档:
tar czf largestfile.tar -T <(find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-)