0

我正在尝试编写一个 bash 脚本来查看两个具有相同名称的文件,每个文件位于不同的目录中。

我知道这可以用 diff -r 来完成,但是,我想将第二个文件中不在第一个文件中的所有内容输出到一个新文件中(也具有相同的文件名)

我已经用 grep 命令编写了一个(嵌套)循环,但它并不好并且返回一个语法错误:

#!/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

非常感谢任何帮助。

4

3 回答 3

1

尝试这个

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

如果 shell 中的语法是

if test_command;then commands;fi

如果 test_command 退出代码为 0,则执行命令

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

但在你的情况下,获取文件名会更有效

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

最后,也许这会比 grep -v 更有效

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

comm -13 将获得第二个而不是第一个的所有内容;不带参数的 comm 生成 3 列输出:第一列只在第一列,第二只在第二列,第三列是常见的。-13 或 -1 -3 删除第一列和第三列

于 2012-07-03T11:54:56.470 回答
0
#!/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
于 2012-07-03T11:55:47.110 回答
0

这假定文件名中没有特殊字符。(例如,空格。如果不可接受,请使用双引号。):

a=/path/dir1
b=/path/dir2
for i in $a/*; do test -e $b/${i##*/} && 
   diff $i $b/${i##*/} | sed -n '/^< /s///p'; done 
于 2012-07-03T12:09:55.743 回答