【问题标题】:find file names that return success on -exec command查找在 -exec 命令上返回成功的文件名
【发布时间】:2013-01-30 07:18:15
【问题描述】:

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

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

【问题讨论】:

    标签: linux bash unix find


    【解决方案1】:

    您只需要在-exec 后面加上-print。这是一个短路布尔值and,通过将-print 放在-exec 之前,打印发生在执行之前。

    find . -name sqlite.db -exec ... \; -print
    

    【讨论】:

      【解决方案2】:

      即使没有找到符合条件的数据,sqite3 也会返回 0。仅当 sql 语句本身或传递的参数有错误时才返回 false。

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

      即使数据库中没有匹配列,也会返回 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
      

      我已经测试过了,它可以工作,但我不确定这是否是您正在寻找的解决方案。

      【讨论】:

      • 谢谢。这给了我grep:';:没有这样的文件或目录''find:-exec:没有终止“;”或“+”'。我是不是错过了什么。
      • findexec 可以很好地处理管道,但您需要调用 shell:find . -exec sh -c 'echo {} | grep .' \;
      【解决方案3】:

      您可以获取退出状态并在 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 {} }' -
      

      【讨论】:

      • exec 本身会检查返回状态,只有在状态成功(0)时才打印文件,所以我认为不需要明确检查。
      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 2012-10-30
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      相关资源
      最近更新 更多