我有一个目录,里面全是 zip 文件,包含很多文件。它们是由软件创建的,目前无法修复。我尝试使用fdupes
,但这个过程花费的时间太长了,因为大约有 50k 个文件。我知道所有大小相同的文件都是重复的,没有任何例外。
那么我现在怎么能删除所有无用的文件?我已经得到了这个命令,它可以打印出要保留的文件,但我不知道如何在一行中将其转换为 cronjob 来使用。
find . -type f -printf "%s %p\n" | grep "zip" | sort -n | uniq -d --check-chars=10
-rw-r--r-- 1 root root 2550472 Apr 22 14:40 save_2016-04-22-14_40_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 14:45 save_2016-04-22-14_45_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 14:50 save_2016-04-22-14_50_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 14:55 save_2016-04-22-14_55_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:00 save_2016-04-22-15_00_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:05 save_2016-04-22-15_05_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:10 save_2016-04-22-15_10_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:15 save_2016-04-22-15_15_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:20 save_2016-04-22-15_20_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:25 save_2016-04-22-15_25_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:30 save_2016-04-22-15_30_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:35 save_2016-04-22-15_35_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:40 save_2016-04-22-15_40_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:45 save_2016-04-22-15_45_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:50 save_2016-04-22-15_50_01.zip
-rw-r--r-- 1 root root 2550472 Apr 22 15:55 save_2016-04-22-15_55_01.zip #keep
-rw-r--r-- 1 root root 2556836 Apr 22 16:00 save_2016-04-22-16_00_01.zip
-rw-r--r-- 1 root root 2556836 Apr 22 16:05 save_2016-04-22-16_05_01.zip #keep
-rw-r--r-- 1 root root 2586848 Apr 22 16:10 save_2016-04-22-16_10_01.zip
-rw-r--r-- 1 root root 2586848 Apr 22 16:15 save_2016-04-22-16_15_01.zip
-rw-r--r-- 1 root root 2586848 Apr 22 16:20 save_2016-04-22-16_20_01.zip #keep
-rw-r--r-- 1 root root 2590213 Apr 22 16:25 save_2016-04-22-16_25_01.zip
-rw-r--r-- 1 root root 2590213 Apr 22 16:30 save_2016-04-22-16_30_01.zip
-rw-r--r-- 1 root root 2590213 Apr 22 16:35 save_2016-04-22-16_35_01.zip
-rw-r--r-- 1 root root 2590213 Apr 22 16:40 save_2016-04-22-16_40_01.zip
-rw-r--r-- 1 root root 2590213 Apr 22 16:45 save_2016-04-22-16_45_01.zip #keep
上面的命令打印如下内容:
2590215 ./save_2016-04-25-14_20_01.zip
2590216 ./save_2016-04-25-14_00_01.zip
2590259 ./save_2016-05-17-13_10_01.zip
2590278 ./save_2016-05-17-13_35_01.zip
2590286 ./save_2016-05-17-13_50_01.zip
2590291 ./save_2016-05-17-14_25_01.zip
2590294 ./save_2016-05-17-13_55_01.zip
有什么想法吗?我也没有权限安装更多软件,只有针对 Ubuntu 服务器 14.04.2 LTS 的命令可用。
答案1
由于您已经有了要保留哪些文件的命令,因此您可以将其与移动命令结合使用mv
。只需将它们移动到另一个文件夹(或为它们提供另一个前缀),删除剩余的文件并将它们移回。
看一下-t
的参数mv
。您可以使用它来指定目标,然后将多个文件通过管道传输到 mv。
答案2
这可能不是至关重要的,但您应该知道,即使两个 zip 文件的大小相同,它们也可能不同。如果您希望消除这种危险,可以检查文件的 md5sum。虽然这仍然不能 100% 保证只删除重复项,但成功率要高得多。
这是使用 awk 将文件名发送到 xargs 进行删除的一种方法(以我的文件为例):
$ ls -l [a-d][1-3].txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 a1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 a2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 a3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 b1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 b2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 b3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 c1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 c2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 c3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 d1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 d2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 d3.txt
$ md5sum [a-d][1-3].txt | sort -k1 | awk '$1==prevsum {print $2}; {prevsum=$1}' | xargs rm
$ ls -l [a-d][1-3].txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 a1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 a2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 a3.txt
因为我不关心文件大小而且我知道文件的命名模式,所以我甚至不必使用 find。