我想知道是否有一种方法可以从具有相同前缀(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
这会给你留下:
filelist.txt
最旧文件的列表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。