Linux bash根据末尾的序列号删除重复文件

Linux bash根据末尾的序列号删除重复文件,linux,bash,shell,Linux,Bash,Shell,Hy 我正在尝试删除文件夹中的一些重复文件(大约50000个文件),这些文件具有相同的名称,但唯一不同的是末尾的序列号: aaaaaaaaaa.ext.84837384 aaaaaaaaaa.ext.44549388 aaaaaaaaaa.ext.22134455 bbbbbbbbbb.ext.11244355 bbbbbbbbbb.ext.88392456 我想根据序列号的最小值删除重复文件(.22134455为aaaaaa.ext保留,11244355为bbb保留) 我提到我的文件夹中有很

Hy

我正在尝试删除文件夹中的一些重复文件(大约50000个文件),这些文件具有相同的名称,但唯一不同的是末尾的序列号:

aaaaaaaaaa.ext.84837384
aaaaaaaaaa.ext.44549388
aaaaaaaaaa.ext.22134455
bbbbbbbbbb.ext.11244355
bbbbbbbbbb.ext.88392456
我想根据序列号的最小值删除重复文件(.22134455为aaaaaa.ext保留,11244355为bbb保留)

我提到我的文件夹中有很多文件~50000个文件,根据大小和md5进行排序和筛选需要花费很长时间

我尝试了
find-not-empty-typef-printf“%s\n”| sort-rn | uniq-d | xargs-I{}-n1 find-typef-size{}c-print0 | xargs-0 md5sum | sort | uniq-w32——所有重复=分离
,但需要永远

非常感谢你使用这个

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
说明:

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

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

    使用此选项

    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
    
    说明:

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

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

    使用此选项

    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
    
    说明:

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

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

    使用此选项

    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
    
    说明:

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


    添加
    -maxdepth 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
    

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

    按文件名列出并排序文件,序列号将用于对重复文件进行排序,如果文件已被“访问”,则删除该文件,否则仅将文件名减去序列保存在临时变量中

    #!/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
    

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

    按文件名列出并排序文件,序列号将用于对重复文件进行排序,如果文件已被“访问”,则删除该文件,否则仅将文件名减去序列保存在临时变量中

    #!/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
    

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

    按文件名列出并排序文件,序列号将用于对重复文件进行排序,如果文件已被“访问”,则删除该文件,否则仅将文件名减去序列保存在临时变量中

    #!/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
    

    为什么要根据大小筛选文件?所以要为每个文件运行一次
    find
    ,并想知道为什么要花很长时间?停止运行
    查找
    内部
    xargs
    !!为什么要根据大小筛选文件?所以要为每个文件运行一次
    find
    ,并想知道为什么要花很长时间?停止运行
    查找
    内部
    xargs
    !!为什么要根据大小筛选文件?所以要为每个文件运行一次
    find
    ,并想知道为什么要花很长时间?停止运行
    查找
    内部
    xargs
    !!为什么要根据大小筛选文件?所以要为每个文件运行一次
    find
    ,并想知道为什么要花很长时间?停止运行
    查找
    内部
    xargs
    <代码>*.ext.
    可能会失败。使用
    查找-name='*.ext.*'
    (甚至只需
    ls
    awk
    中的过滤器)如果它们在子目录中,那么我们需要找到它们。如果它们在当前目录中,
    printf“%s\0”*.ext.
    应该可以工作,对吗?还是我遗漏了什么明显的东西?如果有