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


21

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

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

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


你想删除ras,也就是结了sw..001,还是ras.留下sw.001
凯文(Kevin)

我可能想删除“ ras”。命令会非常不同吗?
保罗

不,只是是否\.在模式中包括。
凯文(Kevin)

Answers:


35

您可以对上一个问题的任一答案进行相当小的修改:

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

要么

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

说明:

rename是一个perl脚本,它使用一个perl正则表达式和一个文件列表,依次将正则表达式应用于每个文件的名称,并将每个文件重命名为应用正则表达式的结果。在我们的情况下,按字面值ras匹配并\.匹配字面值..单独表示换行符以外的任何字符),并且用任何内容替换该字符。

for循环需要,与开头的文件sw.ras.对他们(标准壳水珠)和循环。${var/search/replace}搜索$varsearch和替换第一次出现用replace,所以${file/ras./}回报率$file与第一ras.去除。因此,该命令将文件重命名为minus ras.。请注意,此搜索和替换.是按字面意义进行的,而不是特殊字符。


您能向其他学习者解释您的答案吗?“ s / ras \ .// sw.ras。*”是做什么的?我想我知道,但是我想确定,其他人也可以学习。第二种选择方式相同。
H_12年

1
@ H_7好主意,我添加了一个解释。
凯文(Kevin)

14

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

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

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

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

sudo apt-get install mmv

请参见此处的手册页。


1
那是一个很棒的工具!!!
基督教徒

5

在任何符合POSIX的壳(bashdashksh等):

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

或搭配rename

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

1

最近,我不得不对多个文件进行批量重命名,其中我不得不替换字符中在文件名中多次出现的字符的最后一次出现。在这种情况下,我必须-用下划线替换最后的破折号_,将其改为:

some-long-file-name.ext

到这个:

some-long-file_name.ext

花了一些时间,但是终于做到了:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

这里:

  • ${i%-*} 匹配文件名的开头到最后一个破折号 -
  • ${file##*-} 匹配最后一次破折号后的文件名的其余部分 -
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.