重命名命令的使用

重命名命令的使用

我的问题有两个部分。

我有一系列名为“file.pdb.#”的文件,其中#是一个整数。

1.) 我该如何编写脚本将所有“file.pdb.#”重命名为“file_#.pdb”,其中保留整数?所有文件都在同一目录中。

我大概需要读取常量字符串(file.pdb),其中变量为#。

2.) 更重要的是,我该如何在已回答的问题中正确地搜索这个答案?我毫不怀疑这个问题之前已经回答过很多次了。但是,我不确定我该如何正确地搜索这个问题的答案(显然我应该学会搜索以前回答过的问题,以免将来打扰别人)。我无法想象正确的搜索字符串是什么(在 Linux 中搜索如何读取文件并重命名它们非常通用,我仔细阅读了与这种文件格式操作无关的建议)。

答案1

您可以使用捕获组反向引用例如

rename -vn -- 's/\.(pdb)\.(\d+)/_$2.$1/' *.pdb.*

匹配一个文字句点\.,后跟(文字)字符串pdb,后跟第二个句点\.,然后是一个或多个数字的序列\d+,将字符串和数字序列分别复制到编号的捕获组$1和中$2,然后用下划线以相反的顺序重新替换它们代替第一个句点。

选项-v-n用于详细输出(列出所做的任何更改)和无操作,允许您在进行任何实际替换之前测试正确性:您需要删除该n选项才能实际应用更改

标记--命令选项的结束 - 这只是在文件名以连字符开头的极少数情况下使命令更加强大。


file.pdb.1 file.pdb.2 file.pdb.3 file.pdb.4 file.pdb.5在包含文件(以及其他文件)的目录中进行测试:

$ rename -vn -- 's/\.(pdb)\.(\d+)/_$2.$1/' *.pdb.*
file.pdb.1 renamed as file_1.pdb
file.pdb.2 renamed as file_2.pdb
file.pdb.3 renamed as file_3.pdb
file.pdb.4 renamed as file_4.pdb
file.pdb.5 renamed as file_5.pdb

答案2

尽可能严格的方式,以便只有以 开头且file.pdb.后面至少跟着一个数字的文件名才会被重命名,使用rename

rename -n 's/(file)(\.pdb)\.([0-9]+)/$1_$3$2/' *

如果结果是预期的,请删除该-n选项:

rename 's/(file)(\.pdb)\.([0-9]+)/$1_$3$2/' *

答案3

rename除了已经收到的优秀答案之外,您还可以使用bash参数扩展:

for i in *.pdb.*; do mv -i "$i" "${i%%.pdb.*}_${i##*.}.pdb"; done
  • 该模式${i%%.pdb*}将获得file名称的部分file.pdb.#

  • ${i##*.}将获得以下数字.pdb.

相关内容