删除文件名完全相同但大小不同的重复文件

删除文件名完全相同但大小不同的重复文件

文件夹_1

./a20160606_000000_000021.txt    5KB                                              
./a20160606_000000_000062.txt    5KB  
./a20160606_000000_000531.txt    5KB  
./a20160606_000000_004521.txt    5KB  
./a20160606_000000_003211.txt    9KB  
./a20160606_000000_009451.txt    9KB  
./b20160606_000000_000001.txt    4KB  
./b20160606_000000_000311.txt    6KB  
./b20160606_000000_000632.txt    8KB  
./b20160606_000000_000008.txt    9KB  
./b20160606_000000_000034.txt    12KB  
./b20160606_000000_000245.txt    12KB  
./b20160606_000000_000333.txt    12KB

文件夹_2

./a20160607_000000_000001.txt    9KB                                              
./a20160607_000000_000002.txt    9KB  
./a20160607_000000_000311.txt    9KB  
./a20160607_000000_000500.txt    9KB  
./a20160607_000000_001121.txt    9KB  
./a20160607_000000_004891.txt    9KB  
./b20160607_000000_000021.txt    5KB  
./b20160607_000000_000065.txt    5KB  
./b20160607_000000_000091.txt    5KB  
./b20160607_000000_000134.txt    12KB  
./b20160607_000000_000521.txt    12KB  
./b20160607_000000_001111.txt    12KB

我有这些文件夹,每个文件夹都包含上述文件。每个文件的大小显示在右侧(folder_1 和folder_2 位于同一文件夹中)。我的问题是如何使用删除这些重复的文件find,并且文件必须保留必须是每个文件中最大的文件。输出必须是这样的:

文件夹_1

./a20160606_000000_009451.txt    9KB  
./b20160606_000000_000333.txt    12KB

文件夹_2

./a20160607_000000_000001.txt    9KB   
./b20160607_000000_001111.txt    12KB

答案1

为了严格回答您的问题,您没有基于文件名的重复文件。

如果您想根据文件名的第一部分保留最大的文件,您可以使用以下awk脚本来获取文件名(及其大小),这些文件在第一个下划线之前不是基于前缀的最大文件(a20160606、a20160607、 ETC。):

find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
NAME=substr($1,0,9)
    SIZES[$1]=$2
    if ($2 > MAX[NAME]) {
        MAX[NAME]=$2
    }
}

END {
    for (x in SIZES) {
        for (y in MAX) {
            if (match(x,y) && SIZES[x] != MAX[y]) {
                printf "%s %d\n", x, SIZES[x]
            }
        }
    }
}'

要获取找到的最大值的名称(及其大小)列表,请使用:

find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
    NAME=substr($1,0,9)
    SIZES[$1]=$2
    if ($2 > MAX[NAME]) {
        MAX[NAME]=$2
    }
}

END {
    for (x in SIZES) {
        for (y in MAX) {
            if (match(x,y) && SIZES[x] == MAX[y]) {
                printf "%s %d\n", x, SIZES[x]
            }
        }
    }
}'

可能有更简单的方法可以实现此目的,但这可能有助于获取要删除的文件列表。

相关内容