如何通过删除字符或字符串来重命名多个文件?

如何通过删除字符或字符串来重命名多个文件?

作为我的后续行动上一个问题,如果我有多个以下形式的文件

sw.ras.001
sw.ras.002
sw.ras.003

我可以使用什么命令删除ras.所有文件中间的内容?

答案1

您可以通过对上一个问题的任一答案进行相当小的修改来做到这一点:

rename s/ras\.// sw.ras.*

或者

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

解释:

rename是一个perl脚本,它采用perl正则表达式和文件列表,依次将正则表达式应用于每个文件的名称,并将每个文件重命名为应用正则表达式的结果。在我们的例子中,ras按字面意思匹配并\.匹配文字..单独表示除换行符之外的任何字符),并且它什么也不替换。

for循环获取所有以sw.ras.(standard shell glob) 开头的文件并循环遍历它们。${var/search/replace}搜索第一个匹配项并将其替换为$var,因此返回并删除第一个匹配项。因此,该命令将文件重命名为相同的名称 minus 。请注意,通过此搜索和替换,按字面意思理解,而不是作为特殊字符。searchreplace${file/ras./}$fileras.ras..

答案2

另一种选择是使用 mmv(Mass MoVe 和重命名):

mmv '*ras.*' '#1#2'

不要忘记在模式周围使用单引号,否则星星将在 shell 级别扩展。

该实用程序并不总是可用,但如果不可用,您可以使用以下命令安装它:

sudo apt-get install mmv

请参阅手册页这里

答案3

在任何符合 POSIX 标准的 shell(bashdashksh等)中:

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

或者与rename

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

答案4

使用 find、xargs 和 sed:

find -name 'sw.ras.*' -print0 | sed -ze "p;s/\.ras//" | xargs -0 -n2 mv

https://stackoverflow.com/questions/4793892/recursively-rename-files-using-find-and-sed#comment60553396_11709995

相关内容