怎么吧md5一样的文件全部做成符号连接

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

怎么吧md5一样的文件全部做成符号连接

#1

帖子 ttand » 2008-05-05 11:54

某些图标主题 同样的文件很多,
我想 把一样的文件都只留一个 其余的都做成连接

find -type f -exec md5sum {} +|sort

这样可以按md5 hash 分组
后面是否一定要用条件和循环结构
上次由 ttand 在 2008-05-05 13:04,总共编辑 1 次。
错过好多好贴,没占到广告位后悔啊
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

#2

帖子 yaoms » 2008-05-05 11:58

想法不错。不过实现起来比较困难。。 用 perl 或者 python 吧
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01
送出感谢: 0
接收感谢: 1 次

#3

帖子 xiechy » 2008-05-05 12:53

for i in *
do
for j in *
if diff $i $j >/dev/null
then
ln -sf $i $j
fi
done
done
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

#4

帖子 ttand » 2008-05-05 13:03

xiechy 写了:for i in *
do
for j in *
if diff $i $j >/dev/null
then
ln -sf $i $j
fi
done
done
我开始也这样想 不过 i 和 j 等于同一个文件时候 会怎么样??

且 i,j 是相关的 这样不好吧
错过好多好贴,没占到广告位后悔啊
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
送出感谢: 0
接收感谢: 1 次
联系:

#5

帖子 laborer » 2008-05-05 13:38

给你一个思路

代码: 全选

find -maxdepth 1 -type f -exec md5sum {} \; | 
awk '{ if (A[$1]) system("echo ln -sf "A[$1]" "$2); else A[$1]=$2 }'
不过想要做到比较完备,比如支持目录,支持带空格的文件名等等,还是需要不少考虑的。
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

#6

帖子 ttand » 2008-05-05 14:30

laborer 写了:给你一个思路

代码: 全选

find -maxdepth 1 -type f -exec md5sum {} \; | 
awk '{ if (A[$1]) system("echo ln -sf "A[$1]" "$2); else A[$1]=$2 }'
不过想要做到比较完备,比如支持目录,支持带空格的文件名等等,还是需要不少考虑的。
天哪看不懂awk 我还是把常用的工具熟悉一下再来
错过好多好贴,没占到广告位后悔啊
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01
送出感谢: 0
接收感谢: 1 次

#7

帖子 xiechy » 2008-05-05 17:43

ttand 写了:
xiechy 写了:for i in *
do
for j in *
if diff $i $j >/dev/null
then
ln -sf $i $j
fi
done
done
我开始也这样想 不过 i 和 j 等于同一个文件时候 会怎么样??

且 i,j 是相关的 这样不好吧
diff 和 ln 没那么傻吧 他们自己会处理的 你可以先做个试验 反正我试了没出现问题
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

#8

帖子 ttand » 2008-05-05 19:19

xiechy
文件少可以用
多的话就崩溃了
就是 i,j相关

连來连去 层数过多

diff 比 md5 然后 sort 慢多了

跑了很久 最后 nautilus 挂了 不支持那么多层的符号链吧
错过好多好贴,没占到广告位后悔啊
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

#9

帖子 ttand » 2008-05-05 19:47

ok了

代码: 全选

#!/bin/sh
for i in *
	do
	for j in *
	do
		if ! [ -h $i ]
		then
		if ! [ -h $j ]
		then #还有其他写法没有.......
			if [ $i != $j ]
				then
				if diff $i $j >/dev/null
					then
					ln -sf $i $j
					echo "lnk"
				fi
			fi
		fi
		fi
	done
done
错过好多好贴,没占到广告位后悔啊
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01
送出感谢: 0
接收感谢: 1 次

#10

帖子 xiechy » 2008-05-05 20:05

我错了 :oops:
试试这个吧

代码: 全选

#!/usr/bin/bash
file=($(ls))
for((i = 0; i < ${#file[@]}; i++))
do
if ! [ -h "${file[$i]}" ]
then
for((j = $i + 1; j < ${#file[@]}; j++))
do
if ! [ -h "${file[$j]}" ]
then
if diff ${file[$i]} ${file[$j]} >/dev/null
then
ln -sf ${file[$i]} ${file[$j]}
fi
fi
done
fi
done
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01
送出感谢: 0
接收感谢: 1 次

#11

帖子 xiechy » 2008-05-05 20:07

发完抬头 晕了 :shock:
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#12

帖子 eexpress » 2008-05-05 22:05

肯定先建立列表的了。sort 可以用到。uniq可以作一个比较副本。
● 鸣学
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

#13

帖子 ttand » 2008-05-05 22:23

可以了 现在nuoveXT.2.2的主题包容量降到一半
xiechy那种蛮力法 i j循环遍历。然后就是只要两个都是非符号连接的文件,且不是同一个 就比较,相同就连接。

应该没有漏网的。不过也有缺点 只能工作在一个目录下,最后还是用 find -type d |xargs作引子 用此脚本接受xarg的文件夹路径参数,然后cd 然后 继续弄。。。。

很慢而且不能跨文件夹 ln -sf

改天有空做个纯管道的 :roll:
错过好多好贴,没占到广告位后悔啊
回复

回到 “Shell脚本”