假设我的文件夹包含 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