有两个目录,其中的有若干个文件,文件名相同但是内容可能不同。现在需要用shell脚本进行比对。

作者&投稿:示凯 (若有异议请与网页底部的电邮联系)
用shell脚本编写区别两个文件夹(包括子文件夹)内文件的不同~

下面是我的一种方法,希望有更好的方法进行改进:

#!/bin/bash
basedir="./"
workdir="/tmp"
#这是定义两个目录,按照你的说法,这两个目录下文件名应该都是相同的
dir1="test1"
dir2="test2"
#这是用来保存查找dir1目录的所有文件路径和名称
tempf1="$(mktemp -p $basedir)"
#这是定义比较文件输出到的日志文件
diff_out="diff_between_${dir1}_and_${dir2}.log"
#比较总是需要以一个目录为基准,这里假设以dir1目录为比较基准,这里是递归查找所有文件,并将结果保存到临时文件
find ${workdir}/$dir1 -type f >$tempf1
#判断如果目录中存在对比后的log,就改名
if [ -f "${diff_out}" ];then
mv "${diff_out}" "${diff_out}-$(date +%H%M%S)"
fi
#如果查找dir1目录没有查找到任何文件就退出
if [ -z "$tempf1" ];then
exit 1
fi
#通过循环来比较dir1目录和dir2目录的文件
for myfile in $(cat $tempf1)
do
myfile2="$(echo $myfile | sed "s/${dir1}/${dir2}/")"
if [ -f "$myfile2" ];then
diff -u $myfile $myfile2 | tee -a "$diff_out"
else
echo "$myfile2 not exist!"
fi
done
rm -f $tempf1

事先建立一个文件夹tempfolder,每一个文件与其他所有文件比较后mv到tempfolder,剩下的文件再与其他文件比较。“两个文件某个内容相同”???????
一行格式的命令:

for i in * ;do for j in * ;do if [ -f "$i" ] && [ -f "$j" ] && [ "$i" != "$j" ]; then echo "$i"," ","$j" ;F1=$(grep 内容 “$i”);F2=$(grep 内容 “$j”) ; if [ "$F1" != "" ] && [ "$F2" != "" ] ;then rm "$i" "$j" ;fi ;fi ;done ;if [ -f "$i" ] ;then mv "$i" ./tempfolder;fi; done

多行格式命令:

for i in * ;do
for j in * ;do
if [ -f "$i" ] && [ -f "$j" ] && [ "$i" != "$j" ]; then
echo "$i"," ","$j" #测试语句
F1=$(grep 内容 “$i”)
F2=$(grep 内容 “$j”)
if [ "$F1" != "" ] && [ "$F2" != "" ] ;then
rm "$i" "$j"
fi
fi
done
if [ -f "$i" ] ;then
mv "$i" ./tempfolder
fi
done

diff [options] from-file to-file
语  法:diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
参  数:
-x<文件名或目录>或--exclude<文件名或目录>  不比较选项中所指定的文件或目录。
 -X<文件>或--exclude-from<文件>  您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
 -y或--side-by-side  以并列的方式显示文件的异同之处。
 --help  显示帮助。
 --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
 --suppress-common-lines  在使用-y参数时,仅显示不同之处。
 -t或--expand-tabs  在输出时,将tab字符展开。
 -T或--initial-tab  在每行前面加上tab字符以便对齐。
 -u,-U<列数>或--unified=<列数>  以合并的方式来显示文件内容的不同。
 -v或--version  显示版本信息。
 -w或--ignore-all-space  忽略全部的空格字符。
 -W<宽度>或--width<宽度>  在使用-y参数时,指定栏宽
 -p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
 -P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
 -q或--brief  仅显示有无差异,不显示详细的信息。
 -r或--recursive  比较子目录中的文件。
 -s或--report-identical-files  若没有发现任何差异,仍然显示信息。
 -S<文件>或--starting-file<文件>  在比较目录时,从指定的文件开始比较。
-H或--speed-large-files  比较大文件时,可加快速度。
 -l<字符或字符串>或--ignore-matching-lines<字符或字符串>  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
 -i或--ignore-case  不检查大小写的不同。
 -l或--paginate  将结果交由pr程序来分页。
 -n或--rcs  将比较结果以RCS的格式来显示。
 -N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
 -c  显示全部内文,并标出不同之处。
 -C<行数>或--context<行数>  与执行"-c-<行数>"指令相同。
 -d或--minimal  使用不同的演算法,以较小的单位来做比较。
 -D<巨集名称>或ifdef<巨集名称>  此参数的输出格式可用于前置处理器巨集。
 -e或--ed  此参数的输出格式可用于ed的script文件。
 -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
 -<行数>  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
 -a或--text  diff预设只会逐行比较文本文件。
 -b或--ignore-space-change  不检查空格字符的不同。
 -B或--ignore-blank-lines  不检查空白行。

#!/bin/bash
DIR_A=1
DIR_B=2

#遍历B中所有文件,并比较
function compare()
{
for i in $1/*
do
diff $i $2 >/dev/null #比较
if [ $? -eq 0 ]; then #内容一样,打印提示
echo "$i $2 are the same"
fi
done
}

#遍历A中所用文件
for i in $DIR_A/*
do
compare $DIR_B $i #比较A中的文件与B中所有文件
done


django框架怎么新建项目?
其中path变量中有的已经存有Python的目录,当path需要多个值的时候,两个路径之间用分号“;”隔开 第三步:打开Windows命令行,用django-admin.py创建项目,注意创建项目的路径c:\\users\\fyc 打开目录位置,找到创建的项目,看到里面有一些文件 第四步:用pycharm打开上一步所创建的项目,由于pycharm默认的项目目录是pycharm...

word 自动生成目录如何自己控制前面两个标题没有编号,而后面有有编号...
哈,设置中文摘要及英文摘要为标题六,设置标题六的样式与标题一一致。就可以了么。计算机就是让人骗的嘛

一个林中至少有几个域
域林:由一个或多个域树组成,同一个林中多个域树之间不能共享连续的命名空间,比如已存在树根域a.com,新建的树根域则不能命名为b.a.com 林根域:域林中部署的一个域,同时也是目录林根级域,其中包含Enterprise Admins和Schema Admins组,这两个管理员组中的成员可以对其所在域林进行添加、删除域...

如何进行微信支付测试
4,继续向下滚动到后面,找到“网页授权获取用户基本信息”,修改为服务器域名不添加http。如下所示:5.选择微信支付菜单,选择商家信息,记住微信支付商户号码,登录商家号码平台设置密钥。6,选择开发配置,填写授权支付目录和测试目录,两个目录不一样,然后将你的微信号添加到白名单,这样就可以开始用你...

开始菜单里面的图标的存放位置为什么会有两个不同的地址? 有的是放在...
user是所有用户的,其中的东西都是共享(公用)的。不同账户(用户)登录系统时,可以通用。c盘下的programdata在XP中叫Documents and Settings,在Vista中叫用户和ProgramData。C:\\ProgramData 是个公用的被创建文件夹或文件存放的地方,这些文件夹或文件仅由创建者(用户或帐号)完整控制。打开ProgramData,...

pycharm怎么配置django(pycharm怎么配置pytorch环境)
其中path变量中有的已经存有Python的目录,当path需要多个值的时候,两个路径之间用分号“;”隔开 第三步:打开Windows命令行,用django-admin.py创建项目,注意创建项目的路径c:\\users\\fyc 打开目录位置,找到创建的项目,看到里面有一些文件 第四步:用pycharm打开上一步所创建的项目,由于pycharm默认的项目目录是pycharm...

急!!!如何设置路由器的端口映射,把路由器的端口指向本机IP
1、首先打开电脑上的浏览器,登录路由器。2、查找登录路由器的地址,确认公网IP,登录路由器之后找到网络参数设置。3、找到路由器之后,找到网络配置的防火墙,找到nat配置。4、然后点击端口映射栏目,添加新建一个规则。5、然后在打开的页面中,设置端口映射需要映射的内外IP(刚刚查看的IP),和端口号,...

新的WD移动硬盘 1TB,但里面有两个 autorun,其中一个是文件夹,需要删除...
autorun.inf是自动播放的配置文件,可删可不删,同时不排除是病毒的可能,文件夹如果是空的可删,没用。建议楼主新建一个文件夹,以autorun.inf命名,可以防止感染autorun病毒。

Word 自动生成目录之后 有两个插图也变成目录了 怎么办
改字体还不行,要改样式。选中插图,选样式,选成和别的目录一样的样式,再生成目录就没事了。

Word2016设置完目录之后有两个页码是一样的,怎么解决?
也许你原来就有一个。 选择其中一个后按Delete键删除就行。

南明区13779985619: 求批处理, 当前目录下有若干个文件和文件夹, 保留当前目录下最新的n个文件夹,旧的文件夹删除.仅对 -
司马有清肺: @echo off&setlocal enabledelayedexpansion set n=5 set m=0 for /f "delims=" %%a in ('dir /ad /b /o-d') do ( set /a m+=1 if !m! gtr !n! rd /q /s "%%~nxa") pause保存最新的五个文件夹,如果要改变n,将set n=5 中的5这个数字改为要保留的文件夹数目

南明区13779985619: 批处理如何复制目录下多个子目录中的文件到一个固定的文件夹中
司马有清肺: FOR /f "delims=" %%a in ('dir /b/ad') do move %%a\*.* d:\1\ 把上面那句存为BAT文件,在固定目录下运行后,移动这个目录下所有文件到D盘的1文件夹

南明区13779985619: php中怎样获取目录中文件的个数?
司马有清肺: 写了一个简单的例子给你...自己研究一下吧 <?php/**里面有两个特殊目录,分别是 . 和 ..*/@header("Content-Type:text/html;charset=gbk"); $location='./'; $dp=opendir($location); $i=0; $k=0; while($entry=readdir($dp)) { if(is_dir($location.$...

南明区13779985619: 怎么快速把两个文件夹中的不同文件分出来? -
司马有清肺: 用超级兔子软件中的清理系统中的删除重复文件就可以了

南明区13779985619: 批处理,比较两个目录并将目录下不同的文件名的文件放到另外一个目录 -
司马有清肺: 不需要比对文件属性, 只需要文件名对比就行. 要包括子目录.多谢!! 是做一个批处理文件,运行批处理时copy一个文件到别的目录,,遇到重名文件自动改名. (小楼_春雨 - 进士出身 八级) 答的不错,但我要的是拷贝一个文件到别的目录,遇到重名文件自动改名. 请采纳答案,支持我一下.

南明区13779985619: 文件夹A,B,内有同名的文件若干,如何将两文件夹内容移动至同一文件夹 -
司马有清肺: 去下载一个叫做bulk rename的软件,有汉化版本的.然后先把你的漫画复制一份到别处做备份 然后在bulk中找到你的某一个漫画目录的主目录,选中下面的添加目录名(Append Folder Name),名称为前缀(Prefix),sep填一个分隔符,比如_...

南明区13779985619: word文档如何分开目录与正文 详细?? -
司马有清肺: 分开目录与正文 一、分开目录与正文 不管你的目录有多少页,首先要做的就是将你的目录与正文分开(作用就如同将目录与正文分别存为两个文件一样,可以分别进行不同的操作),操作是将光标定位到正文第一个字之前,使用“插入”菜单...

南明区13779985619: 电脑里面多了两个文件夹,里面就一个文件MRT! -
司马有清肺: 1. Windows 恶意软件删除工具时,该工具会在计算机的根驱动器中创建一个随机命名的临时目录.2. 该目录包含一个 Mrtstub.exe 文件和若干其他文件.3. 大部分情况下,当该工具运行完毕或者在下次重新启动后,该文件夹会自动删除.4. 但有时,该文件夹可能不会自动删除.在这些情况下,可以手动删除该文件夹,而不会对计算机造成不利影响.

南明区13779985619: php中怎样获取目录中文件的个数? -
司马有清肺: $a = count(glob("*",GLOB_ONLYDIR));$b = count(glob("*")); echo '当前目录下文件夹数量:',$a,',文件数量:',$b-$a;//这样就可以获取当前目录的文件夹和文件数量了

南明区13779985619: 怎么批量拷贝一个目录下面的所有文件夹里面一个文件到另一个目录里面 -
司马有清肺: 试试 文件批量复制搜索器 里面好像有你需要的功能,试试其中的第15项功能.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网