在-exec命令中查找返回成功的文件名

时间:2013-01-30 07:18:16

标签: linux bash unix find

我使用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

有没有办法只能获得运行命令的退出状态成功的文件。

3 个答案:

答案 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命令之后添加更多代码,可以查看xargsfind找到的每个输出行执行shell脚本,并将结果作为使用xargs的参数:

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

此外,您的案例中的另一个解决方案可能是使用AWK为每个find输出行执行查询并分别分析其结果:

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