重命名文件时避免替换空格


10

我正在尝试重命名这样的文件:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

但是该sed命令将所有空格替换为_

如何编辑sed命令以使其包含空格和指定的字符?我试过使用,\s但不起作用...

编辑:
例如:文件trip: hill,应重命名:trip_ hill,但是上面的命令使它成为trip__hill


我正在将一些文件从linux移到Mac。但是由于某些原因,Mac系统无法读取所有文件名,因此我试图重命名我的文件。在上面的命令中添加空格不起作用。而且您是正确的:除指定的字符外,我想用'_'替换所有字符。而且我不知道如何包含空格字符。

请注意,我正在尝试将所有字符替换为“ _”,但指定的字符除外。对重命名的文件没有特殊的模式,因此我无法使用此perl命令。

Answers:


11

不要用sed!解析文件名。的输出echo "$file"可能不可靠。

使用rename。在17.10上,您需要先安装

sudo apt install rename

然后:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

笔记

  • -n经过测试以真正重命名文件后删除
  • -- 选项终止(如果任何文件以 -
  • [^-A-Za-z0-9_ .]我们不想替换的字符-放在-第一个或最后一个,这样就不能表示范围(在这些位置上按字面意义对待)。
  • 班级可以包含空格
  • . 按字面意义对待(在其他正则表达式上下文中,它代表任何字符,需要转义)。

这也适用于sed

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill

如果在您的版本的末尾添加一个空格,则会出现错误:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end

-最后,它起作用了:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill

因此,添加空格时,连字符的位置可能引起了您的问题。但是建议不要解析文件名!


此命令有效,谢谢。您还清楚地确定了我使用的命令中的错误。

2
再次感谢你。请注意,在使用sed的情况下,无需使用正斜杠“ \”。因为这会在忽略的字符列表中添加“ \”。

2
@latach这是一个反斜杠,但是您绝对正确。经过测试和挖掘后,我发现这.是字符类中的文字。瓷砖!
Zanna

2

您也可以只使用shell,Bash的参数扩展可以做替换:

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

双斜杠告诉它替换所有匹配项,除此之外,语法很简单。

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.