9

私はfindを使用して、クエリに対していくつかの行を返すデータベースの名前を検索しています。

$ find . -name 'sqlite.db' -exec sqlite3 "{}" 'SELECT * FROM table WHERE column1="value"' \; 

value|a|b|c|d

しかし、データベースの名前が欲しいので、すべての名前を表示する-printを試してみました

$ find . -name 'sqlite.db' -print -exec sqlite3 "{}" 'SELECT * FROM table WHERE column1="value"' \; 

/dir1/a/sqlite.db
value|a|b|c|d
/dir2/a/sqlite.db
/dir2/b/sqlite.db
/dir3/a/sqlite.db

コマンド実行の終了ステータスが成功したファイルのみを取得する方法はありますか?

4

3 に答える 3

11

あなたはただ-print後にする必要があり-execます。これは短絡ブール値であり、の前にand置くことにより、execが実行する前に印刷が行われます。 -print-exec

find . -name sqlite.db -exec ... \; -print
于 2013-01-30T18:57:38.767 に答える
1

基準に一致するデータが見つからない場合でも、sqite3は0を返します。sqlステートメント自体または渡された引数にエラーがある場合にのみfalseを返します。

sqlite3 sqlite.db 'SELECT * FROM table WHERE column1="value"'

データベースにmatchin列がない場合でも、0を返します。検索を機能させるには、コマンドとgrepを組み合わせることができます。

sqlite3 sqlite.db 'SELECT * FROM table WHERE column1="value" | grep value

したがって、findコマンドは次のようになります

find . -name 'sqlite.db' -exec sqlite3 "{}" 'SELECT * FROM table WHERE column1="value"' | grep value \;

編集:

execはパイプを処理できないため、上記は機能しません。パイプを含める方法を参照してください| 私のLinuxで-execコマンドを見つけますか?

find . -name "*.db" -type f | while read file ; do sqlite3 $file "SELECT * FROM table WHERE column1='value'" | grep value ; if [ $? -eq 0 ] ; then echo $file ; fi done

これは私がテストしたものであり、機能しますが、これがあなたが探している解決策であるかどうかはわかりません。

于 2013-01-30T07:31:20.313 に答える
0

終了ステータスを取得し、ifステートメントでテストして、必要な処理を実行できます。

このステータスを取得する方法は、$?変数を使用することです。これに関するチュートリアルは次のとおりです:http://tldp.org/LDP/abs/html/exit-status.html

findコマンドの後にコードを追加したい場合は、xargsによって検出された各出力行に対してシェルスクリプトを実行し、次findを使用して結果を引数として渡すことを検討できxargsます。

find . -name 'sqlite.db' | xargs <your_script>.sh

さらに、あなたの場合の別の解決策は、AWK各出力行のクエリを実行し、findその結果を個別に分析するために使用することです。

find . -name 'sqlite.db' | awk '{system("sqlite3 ..."); if () {} else {} }' -
于 2013-01-30T07:31:09.913 に答える