免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7791 | 回复: 10
打印 上一主题 下一主题

如何快速得出两个文件夹的相同文件名不同文件后缀的清单 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-20 14:27 |只看该作者 |倒序浏览
我有两台server,姑且称为23,25
23,25的文件夹结构相同:/mnt/1/mtv   /mnt/2/mtv /mnt/3/mtv /mnt/4/mtv
现在23和25的文件大多数是同步的,但由于操作人员的问题(以前并未做服务器同步)
现在想得到文件名相同,但文件后缀不同的详细清单(如23的/mnt/2/2233.mpg和25的/mnt/3/2233.vod)
格式:        23                 -----            25
格式:/mnt/2/2233.mpg   ----- /mnt/3/2233.vod
该如何写程序才能以最快的速度完成此操作?
注:23和25这4个文件夹的文件数在5万左右。
我已经写出一个程序,可运行起来很慢。
一个在23服务器的/mnt/1/mtv的文件可能也存在于25的/mnt/3/mtv,或者在23的/mnt/3/mtv里还有同样的文件

[ 本帖最后由 pen10 于 2009-2-20 16:01 编辑 ]

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2009-02-20 14:35 |只看该作者
思路....把这两个server的这/mnt目录下的所有文件名都找出来,比如用find..

然后再对比文件...diff...

论坛徽章:
0
3 [报告]
发表于 2009-02-20 15:17 |只看该作者
忽略这句就可以
一个在23服务器的/mnt/1/mtv的文件可能也存在于/mnt/3/mtv


因为有这个限制后搞不清要怎么分析这种情况:

a.b 在/mnt/1/mtv 也在 /mnt/3/mtv

a.c在 /mnt/3/mtv

这种情况要怎么处理

论坛徽章:
0
4 [报告]
发表于 2009-02-20 16:00 |只看该作者
原帖由 liaosnet 于 2009-2-20 14:35 发表
思路....把这两个server的这/mnt目录下的所有文件名都找出来,比如用find..

然后再对比文件...diff...


第一步我做了
diff可以找出吗,似乎不行的吧

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2009-02-20 16:04 |只看该作者
原帖由 pen10 于 2009-2-20 16:00 发表


第一步我做了
diff可以找出吗,似乎不行的吧

diff的结果不是你要的格式。可以再处理一下。

论坛徽章:
0
6 [报告]
发表于 2009-02-20 16:05 |只看该作者
原帖由 皇家救星 于 2009-2-20 15:17 发表
忽略这句就可以
一个在23服务器的/mnt/1/mtv的文件可能也存在于/mnt/3/mtv


因为有这个限制后搞不清要怎么分析这种情况:

a.b 在/mnt/1/mtv 也在 /mnt/3/mtv

a.c在 /mnt/3/mtv

这种情况要怎么处理


对比是按服务器对比的,不管前面的路径,也就是说/mnt/1/mtv/a.b,/mnt/3/mtv/a.b同时都要和/mnt/3/mtv/a.c对比
在结果里可能是这样的清单
          23    --------      25
/mnt/1/mtv/a.b-------/mnt/3/mtv/a.c
/mnt/3/mtv/a.b-------/mnt/3/mtv/a.c

论坛徽章:
0
7 [报告]
发表于 2009-02-20 16:19 |只看该作者
$1 $2分别是23,25用find命令找出的所有文件
如:find /mnt/1/mtv >23
      find /mnt/2/mtv >>23

我做的脚步,非常慢,看看该如何写
#!/bin/bash

echo "    23's Files       -----       25's Files" >result

arrFiles1=($(cat "$1"))
arrFiles2=($(cat "$2"))

for i in "${arrFiles1[@]}"
  do {
       echo "$i"
       str2=`expr match "$i" '.*\(/.*\)'`
       str3=`expr match "$str2" '\(.*\.\)'`
       str4=`expr match "$str2" '.*\(\..*\)'`
       for j in "${arrFiles2[@]}"
       do {
            str22=`expr match "$j" '.*\(/.*\)'`
            str33=`expr match "$str22" '\(.*\.\)'`
            str44=`expr match "$str22" '.*\(\..*\)'`
            if [[ $str33 = $str3 && $str44 != $str4 ]]
                then echo $i "-----" $j >>result
            fi
          }
       done
     }
  done

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
8 [报告]
发表于 2009-02-20 16:58 |只看该作者
原帖由 pen10 于 2009-2-20 14:27 发表
我有两台server,姑且称为23,25
23,25的文件夹结构相同:/mnt/1/mtv   /mnt/2/mtv /mnt/3/mtv /mnt/4/mtv
现在23和25的文件大多数是同步的,但由于操作人员的问题(以前并未做服务器同步)
现在想得到文件名相同,但文件后缀不同的详细清单(如23的/mnt/2/2233.mpg和25的/mnt/3/2233.vod)
格式:        23                 -----            25
格式:/mnt/2/2233.mpg   ----- /mnt/3/2233.vod
该如何写程序才能以最快的速度完成此操作?
注:23和25这4个文件夹的文件数在5万左右。
我已经写出一个程序,可运行起来很慢。
一个在23服务器的/mnt/1/mtv的文件可能也存在于25的/mnt/3/mtv,或者在23的/mnt/3/mtv里还有同样的文件

#!/bin/sh
find /mnt -type f >txt.23.tmp   #23上执行
find /mnt -type f >txt.25.tmp   #25上执行
awk -F\/ '{print $NF}' txt.23.tmp | sort -u >txt.23
awk -F\/ '{print $NF}' txt.25.tmp | sort -u >txt.25
awk -F. 'NR==FNR{a[$1]=$2}NR>FNR&&a[$1]!=$2{print $1,a[$1],$2}' txt.23 txt.25>diff
while read a b c
do
echo "    23's Files       -----       25's Files" >result
i=`grep "$a.$b" txt.23.tmp`
j=`grep "$a.$c"  txt.25.tmp`
echo "$i    -----     $j" >>result
done<diff

论坛徽章:
0
9 [报告]
发表于 2009-02-20 17:07 |只看该作者
#!/usr/bin/perl
open F23,"23";
while(<F23>)
{
        chomp;
        if( m!.*/([^.]+)(\..*)! )
        {
                ($filename23,$extname23)=($1,$2) ;
                $files{$filename23}=[$extname23,$_];
        }
}
print "23'files\t---------25'files\n";
open F25,"25";
while(<F25>)
{
        chomp;
        ($filename25,$extname25)=($1,$2) if m!.*/([^.]+)(\..*)!;
        if( (exists $files{$filename25} ) && ("$files{$filename25}->[0]" ne "$extname25" ) )
        {
                print "$files{$filename25}->[1]\t\t$_\n";
        }
}

我用perl写了一下,不知道效率如何,使用前23与25文件用find 命令先生成!

[ 本帖最后由 dream3401 于 2009-2-20 17:10 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-02-23 10:00 |只看该作者
原帖由 dream3401 于 2009-2-20 17:07 发表
#!/usr/bin/perl
open F23,"23";
while()
{
        chomp;
        if( m!.*/([^.]+)(\..*)! )
        {
                ($filename23,$extname23)=($1,$2) ;
                $files{$filename23}= ...



感谢dream兄弟,我运行了你的脚本,非常快,大约需要3秒钟搞定
应该来说运行的结果基本正确,再次感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP