通过-find -exec将SQL管道化到mysql

时间:2009-09-03 21:24:49

标签: mysql bash shell find exec

我不能为我的生活得到这个。失败的例子,最后一行在sed中添加,这是最终目标:

find -maxdepth 1 -name "*.sql" -exec "mysql -D ootp < {}" \;
find -maxdepth 1 -name "*.sql" -exec "mysql -D ootp << {}" \;
find . -maxdepth 1 -name \"*.sql\" -exec /usr/bin/mysql -D ootp << sed -e 's/ , );/1,1);/g' {}

是什么给出了?

3 个答案:

答案 0 :(得分:2)

我将以上所有内容重写为以下变体之一:

find -maxdepth 1 -name '*.sql' -exec sed -e 's/ , );/1,1);/g' '{}' +     \
    | mysql -D ootp

find -maxdepth 1 -name '*.sql' -print0 \;                                \
    | xargs -0 sed -e 's/ , );/1,1);/g'                                  \
    | mysql -D ootp

find -maxdepth 1 -name '*.sql' -exec cat '{}' \;                         \
    | sed -e 's/ , );/1,1);/g'                                           \
    | mysql -D ootp

find -maxdepth 1 -name '*.sql' -exec sed -e 's/ , );/1,1);/g' '{}' \;    \
    | mysql -D ootp

第一个变体需要GNU findutils 4.2.12,SRV4派生的find或其他一些与POSIX兼容的find并且应该是最有效的,但可能不适用于所有{{1}实现(特别是,我相信BSD find错过了这个功能)。

答案 1 :(得分:0)

&LT;&LT;是'here document',但您正在使用它,因为它是文件名和/或流。

听起来像你想要的

找到。 -maxdepth 1 -name'* .sql'-exec“sed -e's /,); / 1,1); / g''{}'| / usr / bin / mysql -D ootp”\;

如果您使用-maxdepth 1,也许您可​​以这样做

for i in *.sql ; do 
  sed -e 's/ , );/1,1);/g' "$i" | /usr/bin/mysql -D ootp
done

答案 2 :(得分:0)

我尝试过这样的事情并且对我有用:

find -maxdepth 1 -name "*.sql" -exec sh -c "mysql -D ootp < {}" \;