我有一个目录,重新分组。sql文件和多个数据文件。
/home/barmar/test.dir
├── database.sql
├── table1.unl
├── table2.unl
├── table3.unl
├── table4.unl
├── table5.unl
└── table6.unl
.sql文件包含每个。unl文件的卸载指令,我的问题是。unl文件的名称与。sql上的指令不相同。
通常名称应为TABLE_TABID。直到我寻找一种方法从。sql文件中检索名称并正确地重命名。unl文件。
.sql文件包含多个指令,下面是包含正确名称的行示例。
{ unload file name = table1_89747.unl number of rows = 8376}
可以看到,在示例
中唯一的共同点是表名(table1)。预期结果应该是这样的:
/home/barmar/test.dir
├── database.sql
├── table1_89747.unl
├── table2_89765.unl
├── table3_89745.unl
├── table4_00047.unl
├── table5_00787.unl
└── table6_42538.unl
这行sed
将生成命令,将table1.unl
等文件重命名为table1_89747.unl
:
sed -n 's/.*name = ([^_]*)(_[^.]*.unl).*/mv '''1.unl''' '''12'''/p' <database.sql
假设:=
符号周围有空格,文件名格式为FOO_BAR.unl
,即下划线字符和扩展名始终存在
样本输出:
$ echo '{ unload file name = table1_89747.unl number of rows = 8376}' | sed -n 's/.*name = ([^_]*)(_[^.]*.unl).*/mv '''1.unl''' '''12'''/p'
mv 'table1.unl' 'table1_89747.unl'
生成和执行以下命令:
eval $(sed -n 's/.*name = ([^_]*)(_[^.]*.unl).*/mv '''1.unl''' '''12''';/p' <database.sql | tr -d 'n')
不用说,在运行此操作之前,请确保您的database.sql
没有可能导致重命名当前目录以外的文件的恶意字符串。