【问题标题】:Batch renaming files with text from file as a variable使用文件中的文本作为变量批量重命名文件
【发布时间】:2018-09-01 06:48:24
【问题描述】:

我正在尝试将标题为 {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

【问题讨论】:

    标签: variables unix rename naming file-rename


    【解决方案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 是否被分配了一个合理的值:一个非空的,即一个正确的“标识符”,等等。

    【讨论】:

    • 感谢@sjnarv,您的回答帮助我弄清楚了。我添加了剪辑以删除额外的版本号。感谢您的及时回复!
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 2013-12-19
    • 1970-01-01
    • 2010-10-10
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多