我们从系统中获取了一些作业报告,这些报告以前缀 保存在我们的 Linux 服务器上O*****.TXT
。文件中包含报告的进程 ID。
我可以运行什么脚本来搜索'O****.TXT
目录中的所有文件,并使用每个文件的进程 ID 重命名每个文件?例如:
搜索,重命名OAAJWNZN.TXT
为。ProcID:0000019324
OAAJWNZN.TXT
0000019324.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
您可以在文件所在的目录中使用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
-n
测试后删除rename
以实际重命名文件
解释
for i in O*TXT; do
对所有匹配的文件进行处理rename -n
仅报告新名称,尚未真正重命名(-n
测试后删除)"s/old/new/"
替换old
为new
(使用双引号而不是单引号,以便我们可以传递带有$
扩展的变量)$(command)
命令替换 - 将输出传递command
给其他东西.*\.TXT
匹配任意字符,后跟文字.
,然后TXT
sed
调用我们的朋友sed
来读取文件并从中提取内容-n
在我们要求之前不要打印任何内容-r
使用 ERE,这样我们就不必逃避()
或+
( |^)
空格或行首ProcID:([0-9]+)
ProcID 后至少有一位数字...保存该号码以供日后使用( |$)
空格或行尾\2
返回引用先前保存的模式()
p
编辑后打印结果
答案3
- 循环遍历文件。
- 您可以使用 grep 查找 ProcID
- 将文件移动到新文件名
如果您想保留旧文件或者不确定,请执行 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