Ian*_*anG 7 command-line scripts batch-rename
我们有许多来自系统的作业报告,它们以前缀O*****.TXT. 文件中包含报告的进程 ID。
我可以运行什么脚本来搜索'O****.TXT目录中的所有文件,并使用每个文件中的进程 ID 重命名每个文件?例如:
搜索OAAJWNZN.TXT为ProcID:0000019324,重命名OAAJWNZN.TXT到0000019324.TXT。
然后一旦这个文件被重命名,脚本就会移动到目录中的下一个文件并执行相同的操作。
读取文件并重命名它的 awk 命令:
awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT
Run Code Online (Sandbox Code Playgroud)
由于该ProcID行实际上是:
JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45
Run Code Online (Sandbox Code Playgroud)
要提取 I,P,我们需要在:和上进行拆分),这将为我们0000019324提供第二个字段。
删除echo以实际执行移动。仅当文件名ProcID不包含空格或特殊字符时才使用此选项。
此命令ProcID通过拆分:获得第二个字段,然后使用它和特殊变量FILENAME来构造命令。GNU awk 的文档建议了该printf ... | "/bin/sh"方法。然后我们跳到下一个文件。
您可以在文件所在的目录中使用for,rename和sed:
for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*/\2/p' "$i").TXT/" "$i"; done
Run Code Online (Sandbox Code Playgroud)
测试-n后删除rename以实际重命名文件
for i in O*TXT; do 对所有匹配的文件做一些事情rename -n只需报告新名称将是什么,实际上不要重命名它们(-n测试后删除)"s/old/new/"替换old为new(使用双引号代替单引号,以便我们可以通过$扩展传递变量)$(command)命令替换 - 将输出传递command给其他东西.*\.TXT匹配任何字符后跟文字.,然后TXTsed调用我们的朋友sed来读取文件并从中提取内容-n 在我们要求之前不要打印任何东西-r使用 ERE 这样我们就不必逃跑()或+( |^) 空格或行首ProcID:([0-9]+) ProcID 后至少一位数字...保存数字以备后用( |$) 空格或行尾\2 对先前保存的模式的反向引用 ()p 编辑后打印结果