根据指令文件重命名目录中的文件

Renaming files in a directory based on an instructions file

我有一个重新组合一个 .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.unl 我正在寻找一种方法来从 .sql 文件中检索名称并正确重命名 .unl 文件。

.sql 文件包含多条指令,这里是包含正确名称的行的示例。

{ unload file name = table1_89747.unl number of rows = 8376}

如您所见,唯一的共同点是示例中的 table 名称 (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 '\''.unl'\'' '\'''\''/p' <database.sql

假设:=符号周围存在空格,文件名的格式为FOO_BAR.unl,即下划线字符和扩展名始终存在。

示例输出:

$ echo '{ unload file name = table1_89747.unl number of rows = 8376}' | sed -n 's/.*name = \([^_]*\)\(_[^.]*\.unl\).*/mv '\''.unl'\'' '\'''\''/p'
mv 'table1.unl' 'table1_89747.unl'

要生成执行命令:

eval $(sed -n 's/.*name = \([^_]*\)\(_[^.]*\.unl\).*/mv '\''.unl'\'' '\'''\'';/p' <database.sql | tr -d '\n')

不言而喻,在 运行 之前确保您的 database.sql 没有可能导致重命名当前目录之外的文件的恶意字符串。