如何一次重命名多个文件

如何一次重命名多个文件

假设我的文件夹包含 170 多个文件,这些文件的命名方式如下,'SM-RVT70UQTNWC02.png'$'\r' 我该如何快速将其更改为SM-RVT70UQTNWC02.png?我尝试应用解决方案这个问题然而,我正在努力使我的正则表达式'*(.*)'\$'\\r'工作,rename因为我收到许多错误,例如:

Scalar found where operator expected at (eval 8) line 1, near "*)$\"
        (Missing operator before $\?)
Backslash found where operator expected at (eval 8) line 1, near "$\\"
        (Missing operator before \?)
syntax error at (user-supplied code), near "*)$\"

答案1

假设您使用 列出了文件ls,引号不是文件名的一部分,它们用于帮助理解奇怪的文件名。所讨论的文件是SM-RVT70UQTNWC02.png和回车符(字节 0x0D)的串联,在 Bash 中可以表示为$'\r'(参见ANSI 引用)。

.png要删除当前目录中文件尾部的回车符,

rename 's/\r$//' *.png?

语法含义:s替代回车符\r在行的末尾$什么也没有。

一个符合 POSIX 标准的替代方案是

for f in *.png"$(printf '\r')"; do mv -- "$f" "${f%?}"; done

Printf 是指定回车符的可移植方式,并且${f%?}删除文件名的最后一个字符。

答案2

在该文件夹中运行:

for i in *.png*; do
    mv -i "${i}" "${i%.png*}.png"
done

作为一行代码,它变成了

for i in *.png*; do mv -i "${i}" "${i%.png*}.png"; done

这将循环遍历当前目录中匹配的所有文件*.png*,并通过从开始处截断所有内容来重命名(移动)它们最后的出现.png,然后.png再次附加。使用%%将从第一次出现 开始截断。如果您不想确认覆盖现有文件,.png可以删除。-i

相关内容