linux - 比较文件内容并删除较短的文件

标签 linux file cygwin

我有数千个 .txt 文件。我想删除其中一些。有些文件很相似 - 内容相同,但其中一个较长,我需要删除较短的一个。所有文件都放在一个文件夹中。

关于这些文件唯一已知的是一个文件可以包含内容

ABCDEFGH

还有另一个

ABCDEF

但不是

XYZ

我需要做的是删除文件ABCDEF,该文件具有类似的较长ABCDEFGH 文件。我期望 n*(n-1) 次比较。假设应该以二进制形式比较文件。 bash(或者通常是 Linux)中是否有一个脚本可以为我做到这一点?如果我必须这样做,我会编写一个 C# 控制台应用程序来比较所有文件并删除相似但较短的文件,但我认为在 bash 脚本(或在 Linux 上)中会更容易、更快。允许使用外部工具。如果文件具有相同的内容和相同的长度 - 其中一个文件必须保留在文件夹中。有可能存在3个或更多文件(内容相同)和(相同长度或不同长度)。

最佳答案

任何对此类 Perl 脚本感兴趣的人都会很高兴。我假设我们在当前文件夹中有包含 *.txt 文件的脚本。如果该文件与任何其他文件相同,但更长或更短,因此其中一个文件中存在一些数据使其更长但前面部分没有不同,则较短的文件将被删除。对于 1.3MB 和 1300 个文件,Cygwin Perl 需要不到 2 分钟的时间来浏览所有文件。文件逐行比较。脚本如下:

#!/usr/bin/env perl
use strict;
use warnings;

my @files = <*.txt>;
my @del;
my $diff;
foreach my $file1 (@files) {
        foreach my $file2 (@files) {
                if ($file1 eq $file2) {
                        last;
                }
                open my $fh1, $file1 or die "can't open $file1: $!";
                open my $fh2, $file2 or die "can't open $file2: $!";
                print "Comparing $file1 and $file2...";
                my $line1;
                my $line2;
                $diff=0;
                while($line1 = <$fh1>) {
                        $line2 = <$fh2>;
                        if ($line1 ne $line2) {
                                print "different!\n";
                                $diff=1;
                                last;
                        }
                }
                if ($diff == 0) {
                        print "the same till end of one files!\n";
                        if (-s $file1 >= -s $file2)
                        {
                                push @del, $file2;
                        }
                        if (-s $file1 < -s $file2)
                        {
                                push @del, $file1;
                        }
                }
                close($fh1);
                close($fh2);
        }
}
foreach my $file (@del) {
        print "Removing $file\n";
        unlink $file;
}

请注意,文件的编码和行结尾可能有所不同,因此所有文件都应采用 UTF-8 编码,并且行结尾应相同 - LF。

关于linux - 比较文件内容并删除较短的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50013031/

相关文章:

python - 如何让 BASH 脚本作为进程运行?这样即使 Python 脚本被杀死,BASH 脚本也会永远运行?

c++ - 关于意外断电的原子写入

C - append 到文件的第二行

c# - 序列化和反序列化多个对象

cygwin - 在 cygwin 上安装 uwsgi

linux - 通过 pgAdmin III 的 PostgreSQL - 服务器不监听

c++ - 在基于 Linux 的 WAGO PFC200 PLC 上与 CoDeSys 程序通信

c++ - 未定义的行为 fopen、fclose

bash - 将 Cygwin/bash 结果输出到文本文件

c - 适用于 Windows 和 Cygwin 的 Makefile