我在名为 的目录中有数千个带有 .pdbqt 扩展名的 txt 文件,100000cpds_ligand_00001.pdbqt
我想根据其内容中的唯一标识符重命名它们。100000cpds_ligand_00002.pdbqt
100000cpds_ligand_*****.pdbqt
标识符以REMARK Name = PV-000009607404
单行形式给出,其中PV-000009607404
可以是可变长度、文本和数字(例如ZINC001248485427
等)。我希望只保留文件名中的标识符部分,而不是 部分REMARK Name =
。因此,我会例如更改100000cpds_ligand_00001.pdbqt
为PV-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 的内容即可完成。