jksl
jksl

Reputation: 323

Nested for loop comparing files

I am trying to write a bash script that looks at two files with the same name, each in a different directory.

I know this can be done with diff -r, however, I would like to take everything that is in the second file that is not in the first file and output it into an new file (also with the same file name)

I have written a (nested) loop with a grep command but it's not good and gives back a syntax error:

#!/bin/bash
FILES=/Path/dir1/*
FILES2=/Path/dir2/*

for f in $FILES
do
for i in $FILES2
do 
if $f = $i
grep -vf $i $f > /Path/dir3/$i

done
done

Any help much appreciated.

Upvotes: 0

Views: 2984

Answers (3)

William Pursell
William Pursell

Reputation: 212354

This assumes no special characters in filenames. (eg, whitespace. Use double quotes if that is unacceptable.):

a=/path/dir1
b=/path/dir2
for i in $a/*; do test -e $b/${i##*/} && 
   diff $i $b/${i##*/} | sed -n '/^< /s///p'; done 

Upvotes: 0

vergenzt
vergenzt

Reputation: 10387

#!/bin/bash
DIR1=/Path/dir1
DIR2=/Path/dir2
DIR3=/Path/dir3

for f in $DIR1/*
do
  for i in $DIR2/*
  do 
    if [ "$(basename $f)" = "$(basename $i)" ]
    then
      grep -vf "$i" "$f" > "$DIR3/$(basename $i)"
    fi
  done
done

Upvotes: 0

Nahuel Fouilleul
Nahuel Fouilleul

Reputation: 19315

try this

#!/bin/bash
cd /Path/dir1/
for f in *; do
    comm -13 <(sort $f) <(sort /Path/dir2/$f) > /Path/dir3/$f
done

if syntax in shell is

if test_command;then commands;fi

commands are executed if test_command exit code is 0

if [ $f = $i ] ; then  grep ... ; fi

but in your case it will be more efficient to get the file name

for i in $FILES; do
    f=/Path/dir2/`basename $i`
    grep
done

finally, maybe this will be more efficient than grep -v

comm -13 <(sort $f) <(sort $i)

comm -13 will get everything which is in the second and not in first ; comm without arguments generates 3 columns of output : first is only in first, second only in second and third what is common. -13 or -1 -3 removes first and third column

Upvotes: 1

Related Questions