私は知っていますコア価値UNIXライブラリ(Berkeleyデータベース、データベース管理システム、レディス...).しかし、コーディングを始める前に、次のタスクを実行できるUNIX用の標準ツールがあるかどうかを知りたいです。
$ tool -f datastore.db put "KEY" "VALUE"
$ tool -f datastore.db put -f file_key_values.txt
$ tool -f datastore.db get "KEY"
$ tool -f datastore.db get -f file_keys.txt
$ tool -f datastore.db remove "KEY"
$ etc...
ありがとう
答え1
私はこれを行うことができる標準的なツールがないと思います。grep
//awk
などを除いてsed
。ただし、これを使用すると、ロック、書式設定、特殊文字などの他の多くの問題について心配する必要があります。
使用することをお勧めしますsqlite
。単純なテーブルを定義し、関数を作成してtool_get()
シェルtool_put()
します。sqlite
ポータブルで高速です。
無料で追加の柔軟性を得ることができます。制約、インデックスを定義してスクリプトを調整したり、ある日は別の言語でデータベースを使用したりできます。
答え2
データベースが十分に小さい場合は、ファイルシステムを使用できます。このアプローチの利点は、技術レベルが非常に低く、コードがほとんどなくてもどこでも作業できることです。キーが印刷可能な文字で構成されていて含まれていない場合は、/
ファイル名として使用できます。
put () { key=$1; value=$2; printf %s "$value" >"datastore.db/$key"; }
get () { key=$1; cat "datastore.db/$key"; }
remove () { key=$1; rm "datastore.db/$key"; }
任意のキーを受け入れるには、キーのチェックサムをファイル名として使用し、オプションでキーのコピーを保存します(キーをリストできないか、特定のアイテムのキーが何であるかわからないことに満足しない限り)。
put () {
key=$1; value=$2; set $(printf %s "$key" | sha1sum); sum=$1
printf %s "$key" >"datastore.db/$sum.key"
printf %s "$value" >"datastore.db/$sum.value"
}
get () {
key=$1; set $(printf %s "$key" | sha1sum); sum=$1
cat "datastore.db/$1.value"
}
remove () {
key=$1; set $(printf %s "$key" | sha1sum); sum=$1
rm "datastore.db/$1.key" "datastore.db/$1.value"
}
上記のおもちゃの実装は完全な内容ではありません。有用な情報はまったくありません。不動産取引原子性のようなもの。ただし、ファイルの作成や名前変更などの基本的なファイルシステム操作はアトミックであり、上記の関数のアトミックバージョンを構築できます。
これらの直接ファイルシステムの実装は、小規模データベース(最大数千のファイル)の一般的なファイルシステムにのみ適しています。それに加えて、ほとんどのファイルシステムは大きなディレクトリのために困難を経験します。階層レイアウトを使用して、このスキームをより大きなデータベースに適用できます。たとえば、すべてのファイルを1つのディレクトリに保存するのではなく、ファイル名の最初の数文字に基づいて別々のサブディレクトリに保存します。これは何ですか?子たとえば、対応するオブジェクト(SHA-1ハッシュで索引付けされている)は.git/objects/01/2345679abcdef0123456789abcdef01234567
。ワープラそしてポリボ;両方とも、URLで見つかったページのキャッシュされたコピーをファイルに保存します。www.example.com/HASH
ここで、HASHはURLの一部のハッシュエンコーディングです。
非効率性のもう一つの原因は、ほとんどのファイルシステムが小さなファイルを保存するときに多くのスペースを無駄にすることです。ファイルサイズに関係なく、通常のファイルシステムではファイルあたり最大2kBまで可能です。
物理データベースを使用することを選択した場合は、透過的なファイルシステムアクセスの利便性を放棄する必要はありません。いくつかあります。ヒューズファイルシステムデータベースにアクセスするBerkeleyデータベースが含まれています(Jeff Garzikのdbfs)、Oracle(Oracleデータベースファイルシステム)、MySQL(mysqlfs)、等。
1
同様のURLの場合、http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unix
Polipoはファイルを使用しunix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==
、ファイル内に実際のURLをプレーンテキストで表すヘッダーを追加します。ファイル名はURLのMD5ハッシュ(バイナリ)をBase64でエンコードします。 Wwwoffleはこのファイルを使用しますhttp/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw
。ファイル名はMD5ハッシュのローカルエンコーディングで、付属のファイルにはhttp/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhw
URLが含まれています。
答え3
dbmutil
あなたはあなたが望むものを得ることができます。あなたの質問に説明するタスクのためのシェルユーティリティがあります。正確には標準とは言えませんが、ご希望のアメニティが揃っています。
答え4
使いたいならGBBM GNUデータベース
Debianベースのオペレーティングシステム(buster)でテストされました。
apt install gdbmtool
標準入力からコマンドを読み取るには、 bash gdbmtool を使用します。
$ gdbmtool -s datastore.gdbm <<<"store KEY VALUE"
# load from file (rows format "key: value")
$ gdbmtool -s datastore.gdbm < <(awk -F: '{print "store "$1" "$2}' file_key_values.txt)
$ gdbmtool -s datastore.gdbm <<< "fetch KEY"
# fetch many keys (only values outputed in order)
$ gdbmtool -s datastore.gdbm < <(awk '{print "fetch "$1}' file_keys.txt)
$ gdbmtool -s datastore.gdbm <<<"delete KEY"
$ gdbmtool -s datastore.gdbm list
詳細については、次を参照してください。man gdbmtool
ダンプ
$ gdbm_dump datastore.gdbm > mydump.txt
ロードダンプ
$ gdbm_load mydump.txt datastore.gdbm