请不要fdup..我想制作一个脚本。
我有很多文件重复项,有超过 200 个
我制作了(正在构建)一个 bash 脚本,它使
md5sum 对每个文件,然后使用 uniq 我将重复的 md5 放在
另一个文件,然后我再次检查重复项并将整行
在第三个最终文件中。
现在的问题是……我可以一一删除这些重复项。
但我的问题是:是否可以只找到重复项并放入第四个文件以安全删除?
这是脚本
#!/bin/bash
# Script is "under construction"
# First we make the md5sum
find mp3 -type f -print0 |xargs -0 md5sum|tee firstfile.txt
# Then we find all the md5sum identical and put in secondfile.txt
sort +1rn -2 +0 -1 firstfile.txt |awk '{print $1}'|uniq -d > secondfile.txt
# then we extract from the secondfile and firstfile md5sum and name
while read line;do grep -i $line firstfile.txt;done < secondfile.txt > thirdfinal.txt
现在问题..thirdfinal.txt 包含很多类似于这些的行
625e8fd5f878b19b39826db539e01cda mp3/16.mp3
625e8fd5f878b19b39826db539e01cda mp3/12.mp3
625e8fd5f878b19b39826db539e01cda mp3/20.mp3
625e8fd5f878b19b39826db539e01cda mp3/21.mp3
625e8fd5f878b19b39826db539e01cda mp3/19.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/9.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/5.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/7.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/10.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/8.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/3.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/2.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/1.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/11.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/6.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/4.mp3
d7fbd596e86dfdb546092f34ab8ca576 mp3/25.mp3
d7fbd596e86dfdb546092f34ab8ca576 mp3/25.mp3
我的问题是...如何 grep 第三个文件来获取
第四个文件,其中包含所有重复项......除了第一个文件
行(否则您将删除所有文件,包括原始文件!)
所以你可以有一行重复但同时
保留原件。
第四个文件必须像这样出现
625e8fd5f878b19b39826db539e01cda mp3/12.mp3
625e8fd5f878b19b39826db539e01cda mp3/20.mp3
625e8fd5f878b19b39826db539e01cda mp3/21.mp3
625e8fd5f878b19b39826db539e01cda mp3/19.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/5.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/7.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/10.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/8.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/3.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/2.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/1.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/11.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/6.mp3
7eac02c26935323fe167d6e39ef6bd0a mp3/4.mp3
d7fbd596e86dfdb546092f34ab8ca576 mp3/25.mp3
建议?请不要回答:使用 fdup 或外部程序..I
更喜欢 bash 自动化
答案1
awk '{ if (seen[$1]++) print }' < file3 > file4
这将在第 1 列中构建一个 md5sum 的 awk 数组;如果特定 md5sum 的数组值已经被看到(例如不是第一次看到),然后打印该行。无论哪种方式,它都会从默认值 0 开始递增 md5sum 的数组值。
另一种方法是使用 bash 关联数组:
unset md5sums
declare -A md5sums
while read md5sum path
do
((md5sums[$md5sum]++))
[[ ${md5sums[$md5sum]} -gt 1 ]] && printf "%s %s\n" "$md5sum" "$path"
done < file3 > file4