manas
manas

Reputation: 471

check the content of the files if they are same

i have many .txt files(namely 1.txt, 2.txt 3.txt ...etc) saved in a directory and I want to check if the content of the files inside the directory are same or not

All files should be compared with other file if the content is same then print yes, if content not same print no

For Example: 1.txt

a
b
c

2.txt

a
b
c

3.txt

1
2
3


expected output when compare two file 1.txt 2.txt

1.txt 2.txt yes

expected output when compare two file 1.txt 3.txt
1.txt 3.txt no

expected output when compare two file 2.txt 3.txt
    2.txt 3.txt no

I tried the script

#!/bin/sh
for file in /home/nir/dat/*.txt
do
echo $file
diff $file $file+1
done

But here problem is it doesnot give the output.Please suggest a better solution thanks.

Upvotes: 1

Views: 342

Answers (2)

James Brown
James Brown

Reputation: 37424

Something like this in bash:

for i in *
do 
  for j in *
  do 
    if [[ "$i" < "$j" ]]
    then 
      if cmp -s "$i" "$j"
      then 
        echo $i $j equal
      else 
        echo $i $j differ
      fi
    fi
  done
done 

Output:

1.txt 2.txt equal
1.txt 3.txt differ
2.txt 3.txt differ

Upvotes: 1

markp-fuso
markp-fuso

Reputation: 34846

One idea using an array of the filenames, and borrowing jamesbrown's cmp solution:

# load list of files into array flist[]

flist=(*)

# iterate through all combinations; '${#flist[@]}' ==> number of elements in array

for ((i=0; i<${#flist[@]}; i++))
do
    for ((j=i+1; j<${#flist[@]}; j++))
    do
         # default status = "no" (ie, are files the same?)

         status=no

         # if files are different this generates a return code of 1 (aka true),
         # so the follow-on assignment (status=yes) is executed

         cmp -s "${flist[${i}]}" "${flist[${j}]}" && status=yes

         echo "${flist[${i}]} ${flist[${j}]} ${status}"
    done
done

For the 3 files listed in the question this generates:

1.txt 2.txt yes
1.txt 3.txt no
2.txt 3.txt no

Upvotes: 1

Related Questions