我将提出三种选择。每个命令都是一个简单的单行命令,但是我将为更复杂的情况提供变体,主要是在要处理的文件与同一Directrory中的其他文件混合的情况下。
毫米波
我会用MMV命令
从包同名:
mmv '*HBO_DPM*' '#1dpm#2'
请注意,参数作为字符串传递,因此在外壳程序中不会发生全局扩展。该命令恰好接收两个参数,然后在内部查找对应的文件,而文件数量没有严格的限制。还要注意,上面的命令假定与第一个glob匹配的所有文件都应重命名。当然,您可以自由地更具体:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
如果您在同一目录中有超出请求的数字范围的文件,则最好使用此答案中后面给出的数字循环。但是,您也可以使用一系列具有适当模式的mmv调用:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
遍历数字
如果您要避免安装任何东西,或者需要按数字范围进行选择以避免在此范围之外进行匹配,并且准备等待74,023命令调用,则可以使用普通的bash循环:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
这在这里特别有效,因为序列中没有间隙。否则,您可能要检查源文件是否实际存在。
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
请注意,与for ((i=89000; i<=163022; ++i))
大括号扩展相反,自几年前某些Bash发布以来,它确实处理了前导零。实际上是我要求的更改,因此很高兴看到用例。
进一步阅读: Bash信息页面中的Brace Expansion,尤其是有关的部分{x..y[..incr]}
。
循环文件
另一种选择是在合适的glob上循环,而不是仅在有问题的整数范围上循环。像这样:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
同样,这是mv
每个文件一个调用。同样,循环遍历了一长串元素,但是整个列表没有作为参数传递给子流程,而是由bash在内部处理,因此限制不会给您带来麻烦。
进一步阅读: Bash信息页面中的Shell参数扩展,${parameter/pattern/string}
以及其他文档。
如果要将数字范围限制为您提供的数字范围,则可以为此添加一个检查:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
此处从中${i##pattern}
删除最长的前缀匹配项。最长的前缀定义为任何东西,然后是下划线,然后是零个或多个零。后者写为扩展pattern
$i
*(0)
glob模式,具体取决于所设置的extglob
选项。删除前导零对于将数字视为10而不是8是很重要+([0-9])
的。loop参数是另一个扩展的glob,匹配一个或多个数字,以防万一您那里有以相同的开头但不以。结尾的文件数。
ARG_MAX
限制冲突,因此其他问题上的大多数CLI答案在这里都不起作用。由于此问题明确要求提供命令行解决方案,因此(可能相等)GUI解决方案也与其他问题不匹配。