2つのSQL Bashスクリプトを比較する方法

2つのSQL Bashスクリプトを比較する方法

私は 2 つの SQL ファイルを持っています。1 つは SQLite で変換されたデータベースで、もう 1 つは安全なコピーを作成するための SQL ファイルです。問題は、この 2 つのファイルを比較して安全な保存を行う方法がわからないことです。SQLite で変換されたものと同じにするために必要な最小限の変更は、大きなデータベースを作成するためのものです。現在のスクリプト

#!/bin/bash
#test
#Nombre de los ficheros
sdb=prueba; #Ubicacion del fichero el cual empezaremos la conversion
mysql=SQLprueba; #Nombre del fichero el cual se creara y a posterior se utilizara
script=sqlite3-to-mysql.py #Ubicacion del fichero script.py para conversion
#Login de la base de datos
user=root;
paswd=new_password;

#Almacenador de comandos 
hora_fichero=`ls -l | grep $sdb | cut -d" " -f10 |tr -d ":"`
hora_local=date | cut -d" " -f5 | cut -d":" -f1-2 | tr -d ":"
minutos=5
comandosql=`sqlite3 $sdb .dump> $mysql.sql` #convierte el sqlite en sql
comandomysql= ./$script $mysql.sql >$mysql.mysql #Convierte el sql en mysql
#Inicio del programa 
echo "Convertidor de ficheros automatizado"
if [ "$hora_local-$hora_fichero -lt 5"  ]; then #Realiza la copia de seguridad porque han pasado mas de x segundos
    echo "Vamos a proceder"
    if [ -f $sdb ]; then #Combrueba que el fichero exista por si las moscas
        if [ -f $mysql ]; then #Comprueba que no exista un .mysql y lo borra por si las moscas
            rm $mysql.sql
            echo "el fichero existe, transformando"
            $comandosql
            $comandomysql
        else
            echo "el fichero existe, transformando"
            $comandosql
            $comandomysql
        fi
    else
        echo "el fichero a transformar es inexistente"
    fi
else
    echo "No hay nada a salvar" #No es necesario  copia, no ha habido nada modificado en estos 5 m
fi

答え1

あなたが何を達成しようとしているのかよく分かりません。シナリオは次のようになると思います:

  • 大きなテキストファイルがありますA
  • Bとほとんどの行を共有する大きなテキスト ファイルがありますAが、違いもあります。
  • すべての情報のバックアップを取りたいのですが、両方のファイルをそのままコピー/転送/保存したくありません。代わりに、A そしてBから再現するのに十分な最小限の情報A

もしそうなら、 とdiffpatch必要なツールです。


基本的な手順は非常に簡単です。現在のディレクトリにAと(上書きされるためBファイル名は指定されていない) があると仮定して、次を実行します。A2B.patch

diff A B > A2B.patch

A次に、と がある場合A2B.patch( がない場合B)、次のように再作成できますB

patch -o B A A2B.patch

注: 「A2B.patch」は私が選んだ任意の名前ですfoo。「 」でもかまいません。


ツールは線で動作します。共通の線が少ないほど、このソリューションの効果は低くなります。

スクリプトを正しく解釈すると、 はBの出力になりますsqlite3-to-mysql.py A。 が正確に何をするのかはわかりませんsqlite3-to-mysql.pyし、確実に推測できるほど SQL に精通しているわけでもありません。 のほとんどの行が に変更されて がA作成されるBと、私の解決策は役に立たなくなります。つまり、 は依然として機能するはずですが、patchよりも大きくなるためB、要点が失われます。

一度実行してdiff A B > patchpatch目的に対して十分に小さいかどうかを確認してください。

勉強man 1 patchそしてman 1 diffもっと詳しく知りたいです。また、このサイト答えを書いているときに。

関連情報