我的程序:
find teste1 | while read -r firstResult
do
find teste2 | while read -r secondResult
do
if [[ $firstResult == $secondResult ]]; then
echo "$firstResult" "$secondResult" > equal.lst
else
echo "$firstResult" "$secondResult" > notEqual.lst
fi
done
done
现在,我的问题是,当它在" IF
"命令上搜索发现的内容时,它并不能保存" nock equal"上的差异,也不能保存"等于"的差异。
我在做错事还是错过了任何事情?
如果您不知道答案,或者至少可以将我指向更好的方向,我会非常感谢!:)
我想从该程序中的总数:
搜索一个目录,然后在执行此操作时,搜索另一个目录,如果这些目录上的任何搜索相互匹配,则将其保存到"等于",如果不是相等,则将其保存到" notequal"。
我需要此程序,以便我可以找到哪些文件已重命名或删除,等等。
态看到其他评论后,我尝试与不同的不同:
find teste1 -type f | while read -r firstResult
do
find teste2 -type f | while read -r secondResult
do
diff -rs $firstResult $secondResult
done
done
这个问题是它确实找到了一些"相同"的文件,但是,"相同"是指具有相同的文件。扩展,我可以以某种方式删除这种可能性吗?
------------编辑2 ----------------------
好吧,所以,希望这将是我的最后一个编辑,最终会发布答案,我对原始程序进行了一些修改,我知道它不如大多数在这里的牵强靠近我想要的地方,既然我是菜鸟,请在程序较小时裸露该程序的广泛性:
find teste1 -type f | while read -r firstResult
do
find teste2 -type f | while read -r secondResult
do
firstName=${firstResult##*[/|\]}
secondName=${secondResult##*[/|\]}
if [[ $firstName == $secondName ]]; then
echo "$firstResult" "$secondResult" >> equal.lst
else
echo "$firstResult" "$secondResult" >> notEqual.lst
fi
done
done
现在...我和我的最后一个dillema非常容易:这只会找到并保存使用确切情况的文件,我想想象一下 ->您在1个目录上有一个文件夹,现在有人来了仅在另一个目录上保存另一个文件夹(不同的内容),但将文件夹"重命名"到另一个套管,如第1 dir" test"和第二dir" test"。该程序不会将这两个视为相同,我该如何更改?我听说过案件敏感,但我不知道要把它放在哪里。
我只会在此处使用diff
和comm
:
更新:
(cd teste1 && find . ! -name '.') > list1
(cd teste2 && find . ! -name '.') > list2
# matching names
grep -f list1 list2 > equal.lst
# non matching names
grep -v -f list1 list2 > notEqual.lst
grep -v -f list2 list1 >> notEqual.lst
我认为这可能会对您有所帮助。如果您的目录称为" teste1"one_answers" teste2",则需要运行以下命令,该命令在目录中均显示并计算出那里的所有文件,然后对输出进行排序,因此您将在下面看到重复项。
find teste1 teste2 -type f -exec md5 -r {} ; | sort
示例:
4eccdeeb6650531664510f282cbf3e06 ./Screen Shot 2014-01-29 at 14.30.51.png
66500a7f2a0e5743b82088db7f9d6876 ./a
66500a7f2a0e5743b82088db7f9d6876 ./vt.csv
cdd8ec3e1ec4e0bfd4cd9b5d87fe2fc5 ./Screen Shot 2014-01-29 at 14.29.55.png
您可以看到文件" a"one_answers" vt.csv"(在第二行和第三行中)具有相同的校验和,因此具有与彼此相同的内容,但名称不同。
,或者您可以尝试:
#!/usr/bin/bash
find teste1 -type f | while read -r a
do
echo Checking file: $a
srchfor=$(basename "$a")
lines=$(find teste2 -type f -iname "$srchfor"|wc -l)
if [ $lines -gt 0 ]; then
echo Files with names like $a === $(find teste2 -type f -iname "$srchfor")
fi
done
例如,它会告诉您,teste1中有一个称为" c.html"的文件,而在teste2/sub/directory/where的另一个文件中。
您的尝试永远无法使用,因为teste1/file
永远不会等于teste2/file
。
无论如何,尝试一下:
find teste1 | while read -r firstResult
do
secondResult=teste2/${firstResult#teste1/}
if [ -e "$secondResult" ]; then
echo "$firstResult" "$secondResult" >> equal.lst
else
echo "$firstResult" "$secondResult" >> notEqual.lst
fi
done
用 diff
做到这一点,也许是
diff <(cd teste1; find .) <(cd teste2; find .)
但是,这只会列出差异,而不是相似之处。
这些都没有检查文件的内容,而只是文件名。如果您实际上想找到具有相同名称的文件差异,请尝试
diff -burNad teste1 teste2