从数千个文件中抓取最旧的 100 个文件并将其压缩,同时创建这些文件的列表,以便我稍后可以找到

从数千个文件中抓取最旧的 100 个文件并将其压缩,同时创建这些文件的列表,以便我稍后可以找到

我想知道是否有一种方法可以从具有相同前缀(cdr12345.csz、cdr32342.csv、cdr 98876.csv 等)的目录中获取最旧的 100 个文件,并列出这 100 个文件的名称保存在 file.txt 中,我可以稍后阅读,然后将这 100 个文件压缩起来。我一次只能做 100 个,那么我怎样才能先得到最早的 100 个呢?需要注意的是,zip 文件的大小必须低于 500 mgb。

答案1

在识别最旧的 100 个文件方面,您可以执行以下操作:

ls -1tr /path/to/directory/cdr* | head -n100 > filelist.txt

-1每行列出一个文件(此处并非严格需要),-t将按修改时间排序,最新的在前,并且-r将反转排序顺序(即,将使其在最后列出最新的)。输出到的管道head -n100将列出前 100 行(即,最旧的 100 个文件)。然后,我将其输出重定向到filelist.txt-- 该文件包含 100 个最旧文件的名称。

然后您可以使用以下命令压缩这些文件:

zip backup -@ < filelist.txt

这将创建一个名为 的文件,backup.zip其中包含filelist.txt.该-@选项指示zip从标准输入读取文件名,重定向从文件中提供该列表。

一旦您进行了这么多测试并查看它是否符合您的要求,您就可以删除以下文件filelist.txt

xargs rm < filelist.txt

这会给你留下:

  1. filelist.txt最旧文件的列表
  2. backup.zip最旧文件的内容

请注意,这并不能解决 500MB 文件大小的限制。一种方法是在创建 zip 文件后检查它的大小,如果太大,请减少存档中包含的文件数量。

答案2

虽然保存和重新解析文件名可能很棘手,但如果您的文件名不包含空格或换行符,您可以不那么小心地处理它们。我将展示一种使用 zsh 的方法,其中文件名永远不会直接解析。

将文件名收集到一个数组中:

files=( cdr*.csv(om[-100,-1]) )

这表示匹配以 开头cdr和结尾的文件名.csv,但按o修改时间对这些文件进行排序,然后仅选择其中最旧的 100 个。

您可以通过多种方式将它们打印到文件中,例如:

print -l $files > filelist.txt
printf 'File: %s\n' $files

要创建这些文件的 zip 文件,然后:

zip zipfile $files

...在每个实例中,zsh$files用每个元素替换变量。进行相同扩展的更仔细的方法是使用${files[@]}替代。

答案3

命令

ls -1tr | head -n 100

将为您提供目录中 100 个最旧文件的列表。

您可以将该输出保存到文件中(例如 zip.in)。然后您可以使用该文件创建 zip 文件。例如:

zip zipfile.zip $(cat zip.in)

对于 zip 文件必须小于 500MB 的情况,您可以计算各个文件的总大小,看看它们是否超过 500MB。然而,由于 zip 正在进行一些压缩,因此这是不准确的。只有在创建 zip 文件后您才会知道。

您可以一次将 zip.in 列表中的每个文件添加到 zipfile.zip。添加完每个文件后,您可以检查 zipfile.zip 的大小,看看它是否超过 500MB。

相关内容