任务是根据一组规则将此文本文件(实用程序的输出fslint
)转换为 bash 脚本,其中包含rm
要删除的重复文件的命令行和要保留的文件的注释行。
规则基本上是说:只删除特定目录中的重复文件。
目标是清理多年来在多个操作系统(Mac OS X、Windows、Linux)上积累的大约 1 TB 的重复数据。所有数据都已复制到 Linux 驱动器。
#3 x 697,612,024 (1,395,236,864) bytes wasted
/path/to/backup-100425/file_a.dat
/another/path/to/backup-disk-name/171023/file_a.dat
/yet/another/path/to/labs data/some/path/file_a.dat
#4 x 97,874,344 (293,634,048) bytes wasted
/path/to/backup-100425/file b.mov
/another/path/to/backup-140102/file b.mov
/backup-120708/Library/some/path/file b.mov
/some/other/path/to/backup-current/file b.mov
#2 x 198,315,112 (198,316,032) bytes wasted
/path/to/backup-100425/file_c.out
/another/path/to/backup-disk-name/171023/file_c.out
第一行表示有 3 个相同的副本,file_a.dat
接下来的 3 行列出了它们的路径。理想情况下,应在此处删除 2 个副本。带有 6 位数字的目录(YYMMDD 格式的日期)就是我所说的历史备份目录。
将按此顺序应用于每组相同文件的规则是:
- 如果文件位于包含目录的路径中
Library
,请保留它。 - 如果文件在
labs data
or中backup-current
,请保留它,并删除历史备份目录中的所有重复项。 - 如果文件位于历史备份目录中,请将文件保留在最新的备份目录中,并删除较旧的副本。
- 否则保留文件。
这是所需的输出:
#!/bin/bash
#3 x 697,612,024 (1,395,236,864) bytes wasted
rm '/path/to/backup-100425/file_a.dat'
rm '/another/path/to/backup-disk-name/171023/file_a.dat'
#/yet/another/path/to/labs data/some/path/file_a.dat
#4 x 97,874,344 (293,634,048) bytes wasted
rm '/path/to/backup-100425/file b.mov'
rm '/another/path/to/backup-140102/file b.mov'
#/backup-120708/Library/some/path/file b.mov
#/some/other/path/to/backup-current/file b.mov
#2 x 198,315,112 (198,316,032) bytes wasted
rm '/path/to/backup-100425/file_c.out'
#/another/path/to/backup-disk-name/171023/file_c.out
我对 shell 工具 awk、grep 和 sed 不是很熟悉,在阅读了这个帖子后,我意识到我的初稿在概念上是错误的,“对 [I] 在命令式语言(如 C)中所做的事情的天真翻译”。
事实上,我们在这里处理的不是文件,而是一个文件的内容。
在这种情况下使用 shell 脚本是否合适?
如果是的话,一个高效的脚本会是什么样子?
编辑:在阅读了@Ed的答案和代码后,我试图澄清任务和要求,完美地解决了这个问题。
考虑到我愿意投入多少时间来尝试,我不明白你的要求列表,但这里有一个脚本来分类和打印你似乎感兴趣的文件类型,希望你能弄清楚其余的:
.
对于感兴趣的人,这是给出问题中提到的所需输出的代码。这只是对@Ed 真正智能代码的微小改编。
最后,我想分享一些想法。我希望我不会离题太多。
几周前,我决定最终清理那些可怕的备份数据(有些文件有超过 10 个重复项)。但我找不到自动化任务的工具。而且我不想为此启动一个 C 程序,也不想采用 Perl 的方式。所以我知道我必须(而且我想)走壳路。但我不知道从哪里开始,卡在第一行。
看了很多,还是很迷茫。所以我决定在 SE 上发布我的问题。
当我第一次阅读@Ed 的代码时,我想“这到底是怎么回事!”。然后,当我拿到它时,我意识到这是一段出色的代码,高效且清晰。
所以我们在这里。大约一周前,我
awk
对 RegExp 一无所知。现在,感谢@Ed 的贡献,我已经能够编写“我的”第一个awk
脚本,更好地了解 RegExp 世界,并完成手头的任务。更重要的是,我现在有足够的信心自己深入研究 RegExpawk
和其他文本处理 shell 工具。这也激励我为 SE 做出更多贡献。我只是想分享我的个人经历,给那些可能像我一样被困在一个问题上的人希望,比如面对一座山。