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

10 command-line bash sed batch-rename

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

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

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

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

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

Zan*_*nna 11

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

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

sudo apt install rename
Run Code Online (Sandbox Code Playgroud)

然后:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Run Code Online (Sandbox Code Playgroud)

笔记

  • -n测试后删除以实际重命名文件
  • -- 选项结束,以防任何文件以 -
  • [^-A-Za-z0-9_ .]我们不想替换的字符 - 放在-第一个或最后一个,所以它不能表示一个范围(它在这些位置按字面处理)。
  • 类中可以包含空格
  • . 按字面处理(在其他正则表达式上下文中,它代表任何字符,需要进行转义)。

这也适用于sed

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Run Code Online (Sandbox Code Playgroud)

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

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

-最后,它起作用了:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
Run Code Online (Sandbox Code Playgroud)

因此,当您添加空格时,连字符的位置可能会导致您的问题。但建议不要解析文件名!

  • 再次感谢你。请注意,在使用 sed 的情况下,不需要使用正斜杠“\”。因为这会将 '\' 添加到忽略字符列表中。 (2认同)
  • @latach 这是一个反斜杠,但你是绝对正确的。经过测试和挖掘,我发现 `.` 是字符类中的文字。直到! (2认同)