我使用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
有没有办法只能获得运行命令的退出状态成功的文件。
答案 0 :(得分:9)
您需要在-print
之后-exec
。它是一个短路布尔and
,并且通过将-print
放在-exec
之前,打印发生在exec之前。
find . -name sqlite.db -exec ... \; -print
答案 1 :(得分: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无法处理管道,因此无法正常工作。 见How do I include a pipe | in my linux find -exec command?
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
我已经测试了它的确有效,但我不确定这是否是您正在寻找的解决方案。
答案 2 :(得分:0)
您可以获取退出状态并在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 {} }' -