0

对于我的作业,我必须检查目录中的两个文件是否具有相同的内容,如果是,则将一个文件替换为另一个文件的硬链接。我的脚本看起来像:

    cd $1 # $1 is the directory this script executes in
    FILES=`find . -type f`
    for line1 in $FILES
    do
       for line2 in $FILES
       do
         (check the two files with cmp)
       done
    done

我的问题是我无法找出条件表达式来确保两个文件不相同:如果目录中有文件 a、b、c 和 d,则它不应该返回 true 来检查 a 和 a。我该怎么做呢?

编辑:所以我有这个:

cmp $line1 $line2 > /dev/null
if [ $? -eq 0 -a "$line1" != "$line2" ]

但它会计算文件两次:它检查aand b,然后检查band a。出于某种原因,使用<字符串不起作用。

编辑:我想我想通了,解决方案是\<

4

2 回答 2

1

使用test或其别名[

if [ "$line1" < "$line2" ]
then
    check the files
fi

请注意,我在<这里使用而不是!=(否则会起作用),因此,一旦您与 进行比较ab您以后就不会b与进行比较a

于 2013-10-13T05:36:50.147 回答
0

这是一种优化的方法,它也可以正确处理带有嵌入空格或类似内容的文件:

find . -type f -exec sh -c '
compare() {
  first=$1
  shift
  for i do
    cmp -s "$first" "$i" || printf " %s and %s differ\n" "$first" "$i"
  done
}
while [ $# -gt 1 ]; do
  compare "$@"
  shift
done ' sh {} +
于 2013-10-13T09:16:59.153 回答