find在-exec命令上返回成功的文件名

我正在使用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命令后添加更多的代码,你可以看看xargsfind每个输出行执行一个shell脚本,并使用xargs将结果作为参数传递:

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

另外,在你的情况下,另一个解决方案可能是使用AWK为每个find输出行执行查询并分别分析其结果:

 find . -name 'sqlite.db' | awk '{system("sqlite3 ..."); if () {} else {} }' -