在文件中搜索文本,然后使用该文本重命名文件

Ian*_*anG 7 command-line scripts batch-rename

我们有许多来自系统的作业报告,它们以前缀O*****.TXT. 文件中包含报告的进程 ID。

我可以运行什么脚本来搜索'O****.TXT目录中的所有文件,并使用每个文件中的进程 ID 重命名每个文件?例如:

搜索OAAJWNZN.TXTProcID:0000019324,重命名OAAJWNZN.TXT0000019324.TXT

然后一旦这个文件被重命名,脚本就会移动到目录中的下一个文件并执行相同的操作。

mur*_*uru 7

读取文件并重命名它的 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"方法。然后我们跳到下一个文件。


Zan*_*nna 6

您可以在文件所在的目录中使用for,renamesed

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/"替换oldnew(使用双引号代替单引号,以便我们可以通过$扩展传递变量)
  • $(command)命令替换 - 将输出传递command给其他东西
  • .*\.TXT匹配任何字符后跟文字.,然后TXT
  • sed调用我们的朋友sed来读取文件并从中提取内容
  • -n 在我们要求之前不要打印任何东西
  • -r使用 ERE 这样我们就不必逃跑()+
  • ( |^) 空格或行首
  • ProcID:([0-9]+) ProcID 后至少一位数字...保存数字以备后用
  • ( |$) 空格或行尾
  • \2 对先前保存的模式的反向引用 ()
  • p 编辑后打印结果