使用空格从多个文件中删除某些字符

Cas*_*per 8 linux scripting bash sed

我正在尝试重命名目录中的一堆音乐曲目,但出现此错误:

移动多个文件时,最后一个参数必须是目录

这是脚本:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done
Run Code Online (Sandbox Code Playgroud)

这适用于没有空格的文件,我将如何修改此脚本?

cha*_*aos 14

使用引号:

mv -- "$file" "$(echo "$file" | sed ...)"
Run Code Online (Sandbox Code Playgroud)

否则会mv看到多个参数。名为 的文件名将file name with spaces是 4 个参数mv。因此错误:when moving multiple files, last argument must be a directory。当mv有超过 2 个参数时,假设您要将多个文件移动到一个目录(这将是最后一个参数)。


但是,您似乎想从文件名中删除前 5 个字符。这可以通过以下方式更简单地完成bash

mv -- "$file" "${file:5}"
Run Code Online (Sandbox Code Playgroud)

编辑--感谢@pabouk的评论,我添加了标志。现在以破折号开头的文件-也被正确处理。

  • 这可能不适用于以“-”开头的文件名。使用 `printf '%s\n' "$file"` 代替 `echo "$file"`。 (2认同)