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

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

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

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

这是脚本:

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

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

答案1

使用引号:

mv -- "$file" "$(echo "$file" | sed ...)"

否则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}"

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

答案2

您可以使用 prename,它通常与 Perl 一起分发。 (例如,在 Debian 中,/usr/bin/prename 是由软件包安装的perl。)如果您的发行版未打包(在常规二进制文件位置中查找prenamerename),则可以从许多地方下载它,例如例如这里,这里或者这里

该脚本采用正则表达式应用于每个文件名和一组文件名,并根据该正则表达式修改这些文件的名称。

例如,你可能会这样做

prename -v -n 's/^.{5}//' *

显示如果删除文件名中的前五个字符会发生什么。要实际执行重命名,您只需删除-n.

相关内容