批量重命名文件,文件中的文本作为变量

时间:2018-03-22 17:48:54

标签: variables unix rename naming file-rename

我正在尝试将标题{out1.hmm,out2.hmm,...,outn.hmm}的文件转换为基于文件第三行的唯一标识符{PF12574.hmm,PF09847.hmm, PF0024.hmm}该脚本适用于单个文件,但运行以下命令后该变量不会被覆盖,只剩下一个文件

for f in *.hmm; do output="$(sed -n '3p' < $f | awk -F ' ' '{print $2}' | cut -f1 -d '.' | cat)" | mv $f "${output}".hmm; done;

第一行将所有outn.hmms作为输入调用。第二行设置变量以返回所需的唯一标识符。 SED,AWK和CUT用于获取唯一标识符。该变量应该通过唯一标识符重命名当前文件,但变量保持锁定并覆盖以前的文件。

  

out1.hmm out2.hmm out3.hmm 变为 PF12574.hmm

如何覆盖变量以获得以下文件结构:

  

out1.hmm out2.hmm out3.hmm 变为 PF12574.hmm PF09847.hmm PF0024.hmm

1 个答案:

答案 0 :(得分:1)

您正在将赋值语句的空输出(名为“output”的变量)传递给mv命令。该变量尚未设置,所以我认为将会 - 一个接一个地将所有匹配* .hmm的文件重命名为名为“.hmm”的文件。

尝试ls -a,看看实际发生的是什么。

sedawkcut和(不需要的)cat有点多了。 awk可以满足您的所有需求。然后将mv作为单独的命令执行:

for f in *.hmm
do
  output=$(awk 'NR == 3 {print $2}' "$f")
  mv "$f" "${output%.*}.hmm"
done

请注意,上述内容不会进行任何检查以验证output是否已分配给合理的值:非空的,即正确的“标识符”等。