bash最后根据序列号删除重复文件

时间:2015-03-31 11:44:17

标签: linux bash shell

HY,

我试图删除文件夹(aprox.50000文件)中的一些重复文件,这些文件具有相同的名称,但唯一不同的是最后的序列号:

aaaaaaaaaa.ext.84837384
aaaaaaaaaa.ext.44549388
aaaaaaaaaa.ext.22134455
bbbbbbbbbb.ext.11244355
bbbbbbbbbb.ext.88392456

我想根据序列号的最小值删除重复文件(aaaaaaaaa.ext保留.22134455,bbbbbbbbbb保留.11244355)

我提到我在文件夹〜50.000文件中有很多文件,基于大小和md5的排序和过滤会像永远一样。

我试过了find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate,但是它已经永远地了。

非常感谢

2 个答案:

答案 0 :(得分:2)

使用此

find . -name '*.ext.*' -print0 | sort -z | awk -v RS='\0' -F. '{fn=$0; num=$NF; $NF=""; if(a[$0]){printf "%s\0", fn};a[$0]++;}' | xargs -n 100 -0 rm -f

说明:

  1. find . -name '*.ext.*' -print0:打印由空字符分隔的文件名。
  2. sort -z:对零分隔的条目进行排序。
  3. awk:以空字符和&分隔记录。 .的字段。剥离最后一个字段 - 数字和&记住剩下的文件名。除第一个条目外,打印其他文件名,用空字符分隔。
  4. xargs -0:在stdin&上接收空字符分隔的文件名。 rm -f他们。
  5. 假设:所有文件都在当前目录中。

    添加-maxdepth 1选项以查找命令,如果有子目录&你想跳过迭代它们。

答案 1 :(得分:1)

此脚本将删除目录中的所有重复文件。

按文件名列出和排序文件,序列号将用于对重复项进行排序,如果文件已经被访问则删除该文件,否则只需将文件名减去序列保存在临时变量中。

#!/bin/bash

tmp_filename=

for full_filename in `ls | sort`; do
    filename=$(basename "$full_filename")
    extension="${filename##*.}"
    filename="${filename%.*}"

    if [[ "$tmp_filename" == "$filename" ]]; then
        rm "$full_filename"
    else
        tmp_filename="$filename"
    fi
done