linux shell 使用mv 循环替换文件名
你可以使用 rename
命令来批量重命名文件。在 Linux 系统中,rename
可以接受正则表达式,并进行文件名的替换。
假设你的文件都是以 “微信图片” 开头,你可以使用如下命令:
rename 's/微信图片/ems/' 微信图片*
这个命令会把当前目录下所有以 “微信图片” 开头的文件名中的 “微信图片” 替换为 “ems”。
请注意,rename
的具体使用方式可能因系统而异。在某些系统中,rename
可能会被命名为 prename
。如果你使用的是 macOS,请确保你安装了 rename
命令。
如果你的系统不支持 rename
命令,你可以使用 mv
命令结合循环来实现:
for file in 微信图片*; do
newname=$(echo "$file" | sed 's/微信图片/ems/')
mv "$file" "$newname"
done
这个循环会遍历所有以 “微信图片” 开头的文件,并将文件名中的 “微信图片” 替换为 “ems”。
核心脚本解释:
newname=$(echo "$file" | sed 's/微信图片/ems/')
在这个例子中,整个行都是一个命令。让我们逐步解释:
-
newname=
:这是变量赋值的语法,表示接下来将要给变量newname
赋值。 -
$(...)
:这是命令替换语法。其中的命令echo "$file" | sed 's/微信图片/ems/'
会被执行,然后将其输出结果插入到这个位置。 -
echo "$file" | sed 's/微信图片/ems/'
:这是一个由管道|
连接的两个命令。首先,echo "$file"
会输出变量$file
的内容,然后将其传递给sed
命令进行处理,sed 's/微信图片/ems/'
是一个替换操作,将字符串中的 “微信图片” 替换为 “ems”。
整个行的目的是将文件名中的 “微信图片” 替换为 “ems” 并将结果赋给变量 newname
。
在这个例子中,由于整个行只包含一个命令,因此在该行中没有显式添加分号 ;
也是有效的。在单个命令的情况下,Shell 通常会识别行末尾作为命令的结束,因此分号是可选的。
注意事项:
在 Shell 脚本中,变量赋值时不应该有空格,因为空格会被解释为命令的一部分。因此,应该写成 newname=
而不是 newname =
。
正确的写法:
newname=$(echo "$file" | sed 's/微信图片/ems/')
在这里,$(...)
语法用于执行命令并将其输出赋给变量 newname
。
如果你写成 newname =
,Shell 将尝试执行一个名为 newname
的命令,而不是将等号右侧的内容赋给 newname
变量。
因此,请确保在变量赋值时不要有空格,这是 Shell 语法的一部分。