0

我需要将单个目录中的一批文件重命名为文件内容第一行反引号之间的字符。

文件名:schema.stored.procedure302
文件 的第一行内容为:

/* Procedure structure for procedure `usp_stored_procedure_abc` */

所需的新文件名:usp_stored_procedure_abc.sql


下面是更详细的场景:

我有一个 schema.sprocs.sql 文件,其中仅包含来自 mysqldump 的存储过程。

我使用 csplit 将文件拆分为 300+ 个单独的 sql 文件

csplit -f schema.stored.procedure schema.sprocs.sql '/Procedure structure for procedure/' {*}

这工作得很好,现在我有这样的文件:

schema.stored.procedure302
schema.stored.procedure303
schema.stored.procedure304
等...

我需要帮助的是:
我可以使用哪些命令来读取每个文件的内容,找到模式:

/* Procedure structure for procedure `

然后使用遵循该模式的字符重命名文件,直到找到反引号。

例如:

文件 schema.stored.procedure302 在第一行包含以下行:

/* Procedure structure for procedure `usp_stored_procedure_abc` */

我需要将该文件重命名为:usp_stored_procedure_abc.sql(文件内容第一行反引号之间的内容)。

我确定这是可行的,有人可以帮助我吗?

4

1 回答 1

3

以下字符串显示,我们将如何获得我们的新文件名:

head -n 1 file |awk -F'[`]' '{print $2".sql"}'

完整的脚本是这样的:

#!/bin/bash
for f in *;
do
  d="$(head -n 1 $f |awk -F'[`]' '{print $2".sql"}')" ;
  if [ ! -f "$d" ];
  then
    mv "$f" "$d"
  else echo "File '$d' already exists! Skiped!"
  fi
done
于 2013-04-27T03:20:33.707 回答