Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用md5sum和diff命令根据文件内容查找在到linux目录之间更改的文件名_Bash - Fatal编程技术网

Bash 如何使用md5sum和diff命令根据文件内容查找在到linux目录之间更改的文件名

Bash 如何使用md5sum和diff命令根据文件内容查找在到linux目录之间更改的文件名,bash,Bash,我有两个linux目录dir1和dir2,其中都有一些文件。现在我想要一个文件名列表,与dir1相比,dir2中添加了文件,删除了文件。应根据文件中的数据或内容对文件进行比较。我不熟悉linux bash脚本。请帮帮我 目前我正在这样做,如下所示: find dir1 -iname *.c -o -iname *.h -o -iname *.prm | xargs -n1 md5sum > dir1.fingerprint.md5sum find dir2 -iname *.c -o -i

我有两个linux目录dir1和dir2,其中都有一些文件。现在我想要一个文件名列表,与dir1相比,dir2中添加了文件,删除了文件。应根据文件中的数据或内容对文件进行比较。我不熟悉linux bash脚本。请帮帮我

目前我正在这样做,如下所示:

find dir1 -iname *.c -o -iname *.h -o -iname *.prm | xargs -n1 md5sum > dir1.fingerprint.md5sum
find dir2 -iname *.c -o -iname *.h -o -iname *.prm | xargs -n1 md5sum > dir2.fingerprint.md5sum
cat dir1.fingerprint.md5sum | cut -d" " -f1 | sort -u > dir1.fingerprint
cat dir2.fingerprint.md5sum | cut -d" " -f1 | sort -u > dir2.fingerprint
diff -NrU 2 dir1.fingerprint dir2.fingerprint
我得到的结果是一些更改id,如下所示:

--- dir1.fingerprint    2013-03-08 11:57:24.421311354 +0530
+++ dir2.fingerprint    2013-03-08 11:57:34.901311856 +0530
@@ -1,3 +1,3 @@
-43551a78e0f5b0be4aec23fdab881e65
-4639647e4f86eb84987cd01df8245d14
4c9cc7c6332b4105197576f66d1efee7
+9f944e70cb20b275b2e9b4f0ee26141a
+d41d8cd98f00b204e9800998ecf8427e

我希望结果作为新修改或添加到dir2的文件的文件名。如何得到这个。请帮助我。

使用参数dir2和dir1尝试此脚本

#!/bin/sh
if [ "x$1" == "x" ]
then
exit 0
fi
if [ "x$2" == "x" ]
then
exit 0
fi
#echo "DIFF $1 $2"
if [ -f $1 ]
then
        if [ -e $2 ]
        then
                diff $1 $2 >/dev/null
                if [ "$?" != "0" ]
                then
                        echo "DIFFERENT $1"
                fi
        fi
        exit 0
fi
if [ "x`ls $1`" != "x" ]
then
        for f in `ls $1`
        do
                $0 $1/$f $2/$f
        done
fi
exit 0
编辑:


感谢uba的回复。但是diff命令不会根据文件内容比较difrectory文件。正确的??我希望这件事也能解决。此外,在运行上述脚本时,我几乎没有遇到错误。我正在以:stack.sh dir1 dir2的形式运行脚本,并得到错误:[:5:xdir1:unexpected operator[:9:xdir2:unexpected operator[:5:xdir1/file1.c:unexpected operator dir1/file1.c:unexpected operator dir1/file1.c新添加的[:5:xdir1/file1.h:unexpected operator operator operator][:9:xdir2/file1.h:意外的运算符您可以告诉我这样做有什么问题。我得到的结果只是没有得到文件名。相反,我得到的是文件ID。问题是
sh
shell似乎不支持方括号条件。
bash
支持它们。因此在脚本中,第一个line
#!/bin/sh
应替换为
bash
的路径,该路径可能是
#!/bin/bash
。如果仍然存在一些问题,请添加您得到的输出,以便我能够找出问题。在我的系统上,它工作正常。这适用于修改后的文件。但对于dir1中的文件,它在di中重命名r2它应该显示为重命名。如何做。不..那会变得非常复杂..涉及到每个文件之间的比较,我想..会考虑它并返回..我希望问题至少解决了一半(修改了同名文件)?它是否与添加的行一起工作?进行了一些更改。现在工作。测试它。
if [ "x`ls $1`" != "x" ]
then
        for f in `ls $1`
        do
           if [ -f $1/$f ]
           then
              for g in `ls $2`
              do
                  if [ -f $2/$g ]
                  then
                      diff $1/$f $2/$g >/dev/null
                      if [ "$?" == "0" ]
                      then
                          echo "SAME CONTENT $1/$f $2/$g"
                      fi
                  fi
              done
           fi
        done
fi