我正在尝试提出一个 bash 脚本来删除 CentOS 上的部分文件名。我的文件名是:
119903_Relinked_new_3075_FileNote_07_02_2009_JHughes_loaMeetingAndSupport_FN_205.doc
119904_relinked_new_2206_Support_Intensity_Scale_SYCH_SIS_264549.pdf
119905_relinked_new_3075_Consent_07_06_2009_DSweet_CRFA_CF_16532.docx
29908_relinked_new_2206_Assessor_Summary_Report_SERT_I_OTH_264551.pdf
009712_relinked_new_3075_Consent_07_06_2009_CWell_DPRT_check_CF_16535.pdf
我想119903_Relinked_new_
从文件名中删除。最终结果应该是:
3075_FileNote_07_02_2009_JHughes_loaMeetingAndSupport_FN_205.doc
2206_Support_Intensity_Scale_SYCH_SIS_264549.pdf
3075_Consent_07_06_2009_DSweet_CRFA_CF_16532.docx
2206_Assessor_Summary_Report_SERT_I_OTH_264551.pdf
3075_Consent_07_06_2009_CWell_DPRT_check_CF_16535.pdf
我一直在尝试多个脚本,但都失败了。在大多数情况下,之前的数字_Relinked_new_
是不同的,并且文件扩展名因.pdf
,.docx
等而异.doc
。任何帮助将不胜感激。
使用prename(1)工具(它可能被调用
rename
或prename
取决于perl-rename
您的系统):这将使用正则表达式来匹配模式并将其替换为指定文件上的任何内容。
如果没有该
rename
工具,则使用带有参数替换的简单 shell 循环一次重命名文件:在循环内部, 的值
newname
首先计算为name
变量的文件名部分(路径名中最后一个斜杠之后的最后一位)。然后
newname
通过使用目录路径和从文件名开头删除与 shell 模式匹配的任何文本的结果来修改变量*_[rR]elinked_new_
。通过首先将当前目录更改为文件所在的目录,可以稍微简化代码:
这实际上只是针对您的“参数列表太长”问题的评论,但它开始在评论框中看起来很乱,所以现在它是一个答案。:)
您收到该错误的原因是
*
试图将目录中的每个文件都放到命令行中,该命令行有长度限制。相反,您可以遍历文件(或用于find
做类似的事情)并分别调用 rename :