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

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

我们从系统中获取了一些作业报告,这些报告以前缀 保存在我们的 Linux 服务器上O*****.TXT。文件中包含报告的进程 ID。

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

搜索,重命名OAAJWNZN.TXT为。ProcID:0000019324OAAJWNZN.TXT0000019324.TXT

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

答案1

读取文件并重命名的 awk 命令:

awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT

由于该ProcID行实际上是:

JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45

为了提取 I,P,我们需要在和上进行分割:)这将得到0000019324第二个字段。

删除echo以实际执行移动。仅当文件名ProcID不包含空格或特殊字符时才使用此选项。

该命令ProcID通过拆分:获取第二个字段,然后使用它和特殊变量FILENAME来构造命令。GNU awk 的文档建议printf ... | "/bin/sh"方法。然后我们跳到下一个文件。

答案2

您可以在文件所在的目录中使用forrename和:sed

for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*/\2/p' "$i").TXT/" "$i"; done

-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编辑后打印结果

答案3

  1. 循环遍历文件。
  2. 您可以使用 grep 查找 ProcID
  3. 将文件移动到新文件名

如果您想保留旧文件或者不确定,请执行 cp 而不是 mv。

for file in 0*.TXT; do
  procid=$(grep -Po "(?<=ProcID:)[0-9]*" "$file");
  new_filename="/outputpath/${procid}.TXT";
  if [ ! -f "$newfilename" ]; then
    mv "$file" "$new_filename";
  fi;
done

相关内容