很多重复...没有 fdupes,我想制作一个脚本

很多重复...没有 fdupes,我想制作一个脚本

请不要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

相关内容