やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3ドットコマンド(.archive)

 アーカイブ機能を使う。

成果物

CLIコマンド版

 今回は上記のドットコマンド版。ドットコマンドをCLIコマンドの引数に渡して実行する。

テスト用ファイル作成

echo -e "aaa\nAAA" > A.txt
echo -e "bbb\nBBB" > B.txt
mkdir -p ./D/DD
echo -e "ddd\nDDD" > ./D/DD/DDD.txt

アーカイブファイル作成

sqlite3 texts ".archive -c A.txt B.txt D/"
ls -1 | grep texts
texts

アーカイブファイルの一覧表示

sqlite3 texts ".archive -t"
A.txt
B.txt
D/
D//DD
D//DD/DDD.txt

詳細表示

sqlite3 texts ".archive -tv"
-rw-r--r--          8  2019-08-17 01:44:15  A.txt
-rw-r--r--          8  2019-08-17 01:44:15  B.txt
drwxr-xr-x          0  2019-08-17 01:53:09  D/
drwxr-xr-x          0  2019-08-17 01:53:09  D//DD
-rw-r--r--          8  2019-08-17 01:53:09  D//DD/DDD.txt

アーカイブの展開

 まずは元ファイルを削除する。

rm -rf A.txt B.txt D/

 アーカイブを展開する。

sqlite3 texts ".archive -x"

 ファイル出力されたことを確認する。

find .
.
./D
./D/DD
./D/DD/DDD.txt
./B.txt
./A.txt
./texts

 ファイルの内容も確認。

cat A.txt
aaa
AAA
cat B.txt
bbb
BBB
cat D/DD/DDD.txt
ddd
DDD

SQLite3で確認

sqlite3 texts ".tables"
sqlar
sqlite3 texts ".headers on" "select * from sqlar;"
name|mode|mtime|sz|data
A.txt|33188|1566006255|8|aaa
AAA

B.txt|33188|1566006255|8|bbb
BBB

D/|16877|1566006789|0|
D//DD|16877|1566006789|0|
D//DD/DDD.txt|33188|1566006789|8|ddd
DDD

アーカイブにファイル挿入

 ファイル作成。

echo -e "ccc\nCCC" > C.txt

 ファイルをアーカイブへ挿入する。

sqlite3 texts ".archive -i C.txt"

 アーカイブ一覧にC.txtが追加されていることを確認。

sqlite3 texts ".archive -t"
A.txt
B.txt
C.txt
D/
D//DD
D//DD/DDD.txt

更新

 まずは状態を確認する。

sqlite3 texts "select * from sqlar;"
A.txt|33188|1566006255|8|aaa
AAA

B.txt|33188|1566006255|8|bbb
BBB

D/|16877|1566006789|0|
D//DD|16877|1566006789|0|
D//DD/DDD.txt|33188|1566006789|8|ddd
DDD

C.txt|33188|1566007305|8|ccc
CCC

 B.txtを編集する。末尾にばばばを追記して先頭行aaaを削除する。

echo "ばばば" >> B.txt
sed -ie '1d' B.txt
cat B.txt
BBB
ばばば

 編集をアーカイブに反映する。

 ファイルパスをワイルドカードで指定するとエラーになった。

sqlite3 texts ".archive -u *.txt"
ERROR: cannot stat file: *.txt

 パスを指定しなければエラーは出ないが反映されず……。

sqlite3 texts ".archive -u"
sqlite3 texts "select * from sqlar;"
A.txt|33188|1566006255|8|aaa
AAA

B.txt|33188|1566006255|8|bbb
BBB

D/|16877|1566006789|0|
D//DD|16877|1566006789|0|
D//DD/DDD.txt|33188|1566006789|8|ddd
DDD

C.txt|33188|1566007305|8|ccc
CCC

 固定名で指定すれば成功。

sqlite3 texts ".archive -u B.txt"
A.txt|33188|1566006255|8|aaa
AAA

D/|16877|1566006789|0|
D//DD|16877|1566006789|0|
D//DD/DDD.txt|33188|1566006789|8|ddd
DDD

C.txt|33188|1566007305|8|ccc
CCC

B.txt|33188|1566007713|14|BBB
ばばば

 ワイルドカードが使えないのは痛い。CLI-Aでやったほうが良さそう。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで