我正在尝试编写一个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
任何帮助非常感谢。
答案 0 :(得分: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删除第一列和第三列
答案 1 :(得分: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
答案 2 :(得分: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