Linux bash根据末尾的序列号删除重复文件
Hy 我正在尝试删除文件夹中的一些重复文件(大约50000个文件),这些文件具有相同的名称,但唯一不同的是末尾的序列号: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保留) 我提到我的文件夹中有很
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.
应该可以工作,对吗?还是我遗漏了什么明显的东西?如果有