我的问题有两个部分。
我有一系列名为“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.