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

Batch renaming files with text from file as a variable

我正在尝试根据文件的第三行将标题为{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 }' | cut -f1 -d '.' | cat)" | mv $f "${output}".hmm; done;

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

out1.hmm out2.hmm out3.hmm becomes PF12574.hmm

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

out1.hmm out2.hmm out3.hmm becomes PF12574.hmm PF09847.hmm PF0024.hmm

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

尝试 ls -a 看看是否确实如此。

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

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

请注意,上面没有做任何检查来验证 output 是否分配给了一个合理的值:non-empty,一个正确的 "identifier",等等。