
我有 2 個 SQL 文件,其中 1 個是 SQLite 轉換的資料庫,另一個是用於製作安全副本的 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
。
如果是這樣,那麼diff
和patch
就是您需要的工具。
基本流程非常簡單。假設您目前目錄中有A
and B
(並且沒有指定文件,A2B.patch
因為它將被覆寫),請執行:
diff A B > A2B.patch
然後,如果您有A
and 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 > patch
一次並檢查是否patch
足夠小以滿足您的目的。
學習man 1 patch
和man 1 diff
了解更多。我也在諮詢這個網站在寫我的答案時。