根据文件内容重命名文件

根据文件内容重命名文件

我在名为 的目录中有数千个带有 .pdbqt 扩展名的 txt 文件,100000cpds_ligand_00001.pdbqt我想根据其内容中的唯一标识符重命名它们。100000cpds_ligand_00002.pdbqt100000cpds_ligand_*****.pdbqt

标识符以REMARK Name = PV-000009607404单行形式给出,其中PV-000009607404可以是可变长度、文本和数字(例如ZINC001248485427等)。我希望只保留文件名中的标识符部分,而不是 部分REMARK Name =。因此,我会例如更改100000cpds_ligand_00001.pdbqtPV-000009607404.pdbqt。我可以从命令行执行此操作,但我很想使用一个小脚本。

非常感谢您的帮助!

答案1

我做了一个示例,它应该只复制文件而不是重命名。注释表明了一些逻辑。我不是 bash 专家,但我在一个文件上测试了这一点。

您应该在与源文件相同的目录中创建此文件,并将其命名为pdbqt-mover.sh

您可以通过键入来调用它bash pdbqt-mover.sh,或者您必须设置文件的权限,以便可以使用来执行它./pdbqt-mover.sh

#!/bin/bash
# process only files starting with 100000cpds_ligand_ and ending in .pdbqt
for infile in 100000cpds_ligand_*.pdbqt; do

  # get the pv-* string from lines beginning with "REMARK  Name = "
  # get the group matching PV-**** up to the end of the line
  pvnum=$(sed -n 's/^REMARK  Name = \(PV-\S*\)/\1/p' "$infile")

  # construct the output filename
  outfile="$pvnum".pdbqt

  # only copy if the output file doesn't exist
  if [ ! -f $outfile ] ; then
    # cp instead of mv
    cp "$infile" "$outfile"
    echo "Copied $infile to $outfile"
  else
    echo "File $outfile exists! Skipping"
  fi
done

答案2

使用 grep 和名为 RANGER 的终端文件浏览器可以轻松完成此操作。首先使用 grep 提取包含文件名的行。例如

grep REMARK * > fnlist

编辑 fnlist 并删除多余的字符串“REMARK NAME =”。现在您有一个干净的新文件名列表。

启动 Ranger,导航到包含文件的目录并执行批量重命名操作。粘贴 nflist 的内容即可完成。

相关内容