我正在使用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
有没有办法只能得到命令的退出状态是成功的文件。
你只需要在-exec
之后-print
。 这是一个短路布尔值,并且通过在-exec
之前加上-print
,打印在exec之前发生。
find . -name sqlite.db -exec ... \; -print
即使没有找到符合条件的数据,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 . -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
这我已经测试过,它的工作原理,但我不知道这是否是您正在寻找的解决方案。
你可以得到退出状态,并在if语句中进行测试,以便做你想做的事情。
获得这种状态的方法是使用$?
变量。 这是一个关于它的教程: http : //tldp.org/LDP/abs/html/exit-status.html
如果你想在find
命令后添加更多的代码,你可以看看xargs
为find
每个输出行执行一个shell脚本,并使用xargs
将结果作为参数传递:
find . -name 'sqlite.db' | xargs <your_script>.sh
另外,在你的情况下,另一个解决方案可能是使用AWK
为每个find
输出行执行查询并分别分析其结果:
find . -name 'sqlite.db' | awk '{system("sqlite3 ..."); if () {} else {} }' -