我有一个文件列表,包含许多这样的行:
./file_name_0.jpg
./file_name_1.jpg
./file_name_2.jpg
./file_name_3.jpg
./file_name_4.jpg
./file_name_5.jpg
./file_name.jpg
./file_name1_0.jpg
./file_name1_1.jpg
./file_name1.jpg
./file_name2_0.jpg
./file_name2_1.jpg
./file_name2_2.jpg
./file_name2_3.jpg
./file_name2_4.jpg
./file_name2_5.jpg
./file_name2.jpg
在上面的列表中,我有两个文件,我知道这些文件已被复制了6次。我希望删除这些重复项。如果文件复制的次数少于6次,我希望文件保留。
换句话说,我想要实现的是删除文件名包含所有变体的所有文件_0.jpg
,_1.jpg
,_2.jpg
,_3.jpg
,最后_4.jpg
,_5.jpg
。
对于上面的输入,我希望这样的输出
rm ./file_name_0.jpg
rm ./file_name_1.jpg
rm ./file_name_2.jpg
rm ./file_name_3.jpg
rm ./file_name_4.jpg
rm ./file_name_5.jpg
# ./file_name.jpg # do not remove, it is the original file.
# ./file_name1_0.jpg # do not remove, it is a legitimate copy.
# ./file_name1_1.jpg # do not remove, it is a legitimate copy.
# ./file_name1.jpg # do not remove, it is the original file.
rm ./file_name2_0.jpg
rm ./file_name2_1.jpg
rm ./file_name2_2.jpg
rm ./file_name2_3.jpg
rm ./file_name2_4.jpg
rm ./file_name2_5.jpg
# ./file_name2.jpg
我遇到的困难是确保file_name1_1.jpg
这样的文件不被删除 - 这是一个合法的文件,因为该集合中的重复项少于6个。
答案 0 :(得分:0)
这不是完全解决您的问题,因为它实际上并不确保文件0-5在那里。相反,它只检查那里有6个后缀文件:
grep _ temp.txt | cut -d_ -f1 | sort | uniq -c | \
grep '^ *6' | sed -e 's/^ *6 /rm /' -e 's/$/_*.jpg/'
首先它用下划线字符隔离线,然后它只获得第一个下划线之前的部分,然后它对所有内容进行排序,然后计算每个前缀的出现次数,然后它只抓取出现6次的前缀,然后它用rm
替换计数,并在末尾添加一个glob,以匹配具有该前缀的所有文件。
答案 1 :(得分:0)
这是一个可执行的awk脚本,它将指示所需的文件到" rm":
#!/usr/bin/awk -f
BEGIN {FS="_"}
{ sub(FS $NF "$", ""); key=$0 } # make a key by dropping the last field
{ cnts[key]++ } # count how many matching prefixes there are
END {
for(key in cnts) { # for a count `key` in cnts
if(cnts[key]==6) { # check to see if the `key` cnt is 6
for(i=0;i<6;i++) { # if it is build an output line for each case
print "rm " key FS i ".jpg" # make the output `command` here.
}
}
}
}
这不会显示已保留的行。它仅为应删除的每个文件创建rm
命令。另请注意,它假设每个文件都以&#34; .jpg&#34;结尾。输出的顺序无法保证,但如果您需要订购,可以通过sort
传送。这也适用于文件名中出现_
的情况。
根据您的输入,它会产生:
rm ./filename2_0.jpg
rm ./filename2_1.jpg
rm ./filename2_2.jpg
rm ./filename2_3.jpg
rm ./filename2_4.jpg
rm ./filename2_5.jpg
rm ./filename_0.jpg
rm ./filename_1.jpg
rm ./filename_2.jpg
rm ./filename_3.jpg
rm ./filename_4.jpg
rm ./filename_5.jpg