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


8

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

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

这是脚本:

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

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

Answers:


14

使用引号:

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

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


但是,看起来您想从文件名中删除前5个字符。这可以通过以下操作更简单地完成bash

mv -- "$file" "${file:5}"

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


2
可能不适用于以开头的文件名-。代替echo "$file"使用printf '%s\n' "$file"
pabouk

我忘了mv。:)您处理了这种情况:) ---我的意思是echo本身存在问题。例如GNU回声(包括单机和内置的bash)不打印这些字符串:-n-e-E。即使根据POSIX定义,也无法echo可靠使用,因为某些情况尚未定义。符合XSI的echo将解释反斜杠转义序列。--- printf '%s\n'没有这种不需要的和依赖实现的效果。
pabouk

3

您可以使用通常与Perl一起分发的名称。(例如,在Debian中,在/ usr / bin中/女士prename由安装perl包)。如果不是你的发行版(外观为包装prenamerename在传统的二进制文件的位置),它是可供下载从许多地方,如例如这里这里这里

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

例如,您可能会

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

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

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.