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
,但是它已经永远地了。
非常感谢
答案 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
说明:
find . -name '*.ext.*' -print0
:打印由空字符分隔的文件名。sort -z
:对零分隔的条目进行排序。awk
:以空字符和&分隔记录。 .
的字段。剥离最后一个字段 - 数字和&记住剩下的文件名。除第一个条目外,打印其他文件名,用空字符分隔。xargs -0
:在stdin&上接收空字符分隔的文件名。 rm -f他们。假设:所有文件都在当前目录中。
添加-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