如何解决如何使用rm删除文本文件中列出的除最旧的重复文件之外的所有文件
我关注了 Rick James 关于如何定位重复项的文章。他只制作了一个包含 md5 哈希值、计数、文件名的文件列表。
find . -type f -not -empty -exec md5 -r {} \; > ~/Desktop/file_list.txt
sort ~/Desktop/file_list.txt > ~/Desktop/file_list_sort.txt
cat ~/Desktop/file_list_sort.txt | cut -d ' ' -f1 | sort | uniq -c | sort -n | grep -v '^ 1 ' | awk '{ t=$1 ; $1=$2; $2=t; print }' | sort > ~/Desktop/file_counts.txt
join -1 1 -2 1 ~/Desktop/file_counts.txt ~/Desktop/file_list_sort.txt |sort -k2,2 -n -k1,1 > ~/Desktop/file-dups.txt
我最终得到了一个列表,其中仅包含在特定目录中具有多个副本的文件。
我正在寻找一种方法来rm
除了每个重复文件中最旧的文件之外的所有文件。
包含 md5 哈希值、重复次数和文件名的文件示例。
0b54612fad50cf28605bdb1d57eb36bf 3 ./20180505 142648-0586AA69.m4a
0b54612fad50cf28605bdb1d57eb36bf 3 ./20180505 142648-39FD9F97.m4a
0b54612fad50cf28605bdb1d57eb36bf 3 ./20180505 142648-B8DCAD18.m4a
0ecba4fdcaeacfe6f48639a6a3caeef6 3 ./20180526 202610-67CA5ED6.m4a
0ecba4fdcaeacfe6f48639a6a3caeef6 3 ./20180526 202610-9210FBD9.m4a
0ecba4fdcaeacfe6f48639a6a3caeef6 3 ./20180526 202610-9E04AD1E.m4a
a44705a9a57c1cd641148824cd7dd16f 3 ./20180613 133550-1DF6AAF3.m4a
a44705a9a57c1cd641148824cd7dd16f 3 ./20180613 133550-728FE95E.m4a
a44705a9a57c1cd641148824cd7dd16f 3 ./20180613 133550-A15C8237.m4a
需要考虑的事项:
-
我希望得到每组重复项中最旧的,但在这种情况下,三个副本中的两个共享相同的创建日期。
-
此列表可能包含每个文件的 2 个或更多副本。在这种情况下有 3 个。
预期结果: 如果有两个重复项,我想删除除最旧的之外的所有副本。 如果有三个重复项,我想删除除最旧的之外的所有副本。如果有四个重复项,我想删除除最旧的之外的所有副本。等
解决方法
听起来像是fdupes的工作。
,这会起作用,但不一定会保存最旧的:
find . -type f -not -empty -exec md5 -r {} \; | sort | while read cksum fname; do [[ "$lastcksum" = "$cksum" ]] && rm $fname; lastcksum=$cksum; done
,
我写了一个简短的 bash 脚本,我们称之为“dup.sh”
#!/bin/bash
exec 5<$1
last_hashkey=""
last_file=""
while true ; do
read line<&5
if [ "$line" == "" ] ; then break ; fi
current_hashkey=${line%% *}
current_file=${line##* }
echo "current_hashkey=$current_hashkey ; current_file=$current_file"
if [ "$current_hashkey" == "$last_hashkey" ] ; then
rm $last_file
fi
last_hashkey=$current_hashkey
last_file=$current_file
done
exec 5<&-
该脚本执行以下操作: (1) 它在其命令行参数中打开文件, (2) 循环读取文件的每一行(分离 md5sum 和文件名) (3) 保留当前行和上一行的值(保留 md5 和文件名) (4)当文件的连续两行有相同的md5时,删除前面的文件名。
在脚本结束时,只保留最新行中具有任何给定 md5 总和值的文件。
假设您的 md5sum 和文件名列表位于名为“list.txt”的文件中,其中包含:
0b54612fad50cf28605bdb1d57eb36bf 3 ./20180505 142648-0586AA69.m4a
0b54612fad50cf28605bdb1d57eb36bf 3 ./20180505 142648-39FD9F97.m4a
0b54612fad50cf28605bdb1d57eb36bf 3 ./20180505 142648-B8DCAD18.m4a
0ecba4fdcaeacfe6f48639a6a3caeef6 3 ./20180526 202610-67CA5ED6.m4a
0ecba4fdcaeacfe6f48639a6a3caeef6 3 ./20180526 202610-9210FBD9.m4a
0ecba4fdcaeacfe6f48639a6a3caeef6 3 ./20180526 202610-9E04AD1E.m4a
a44705a9a57c1cd641148824cd7dd16f 3 ./20180613 133550-1DF6AAF3.m4a
a44705a9a57c1cd641148824cd7dd16f 3 ./20180613 133550-728FE95E.m4a
a44705a9a57c1cd641148824cd7dd16f 3 ./20180613 133550-A15C8237.m4a
现在,如果您键入以下命令:
bash dup.sh list.txt
您只需保留与任何给定 md5sum 值的最新行相对应的一个文件,删除具有相同 md5sum 值的先前文件...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。