0

それぞれ異なるディレクトリにある同じ名前の2つのファイルを調べるbashスクリプトを作成しようとしています。

これはdiff-rで実行できることはわかっていますが、最初のファイルにない2番目のファイルにあるものをすべて取得して、新しいファイル(同じファイル名)に出力したいと思います。

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

シェルの構文が

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は、最初ではなく2番目にあるすべてのものを取得します。引数のないcommは、3列の出力を生成します。1つ目は1つ目のみ、2つ目は2つ目、3つ目のみが一般的です。-13または-1-3は、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 に答える