如何创建由多个目录中最大的文件组成的压缩存档?

如何创建由多个目录中最大的文件组成的压缩存档?

我想编写一个脚本,该脚本将创建一个压缩存档文件,其中包含多个目录中超过特定​​阈值的最大文件。例如,我想知道如何取出 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-)

相关内容