我想更改这些文件名
download (19).download
...
download (27).download
到
download (19).html
...
download (27).html
我运行失败
mv *.download *.html
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
如何更改文件名? 我想我可能需要一个正则表达式。
答案1
您只能用于mv
将多个文件移动到 on call 中的单个目录。这里的一个选项是使用prename
(rename
在大多数系统上链接到此,但不是全部):
prename -n 's/download$/html/' -- *.download
-n
当您确定这符合您的要求时,请将其删除。另一种方法是简单地使用循环:
for file in *.download; do
mv -i -- "$file" "${file%download}html"
done
-i
添加该选项mv
以提示是否有文件将被覆盖。如果您确定不会覆盖您需要的任何文件,请将其删除。
答案2
mv
这样行不通。您需要另一个工具,例如rename
或mmv
。请注意,周围有两个版本rename
。
当然,shell 可以做到这一点(使用mv
):
for file in *.download; do
fbasename="${file%.download}"
if [ -e "${fbasename}.html" ]; then
echo "${fbasename}.html exists; skipping."
echo "${fbasename}.html exists; skipping." >>rename.log
continue
else
echo mv -- "$file" "${fbasename}.html"
fi
done
测试后删除echo
。
道路mmv
:
mmv -n '*.download' '#1.html'
-n
阻止执行并向您展示将要执行的操作。
答案3
rename 's/download$/html/' *.download
应该适合你
答案4
如果您碰巧有zsh
可用的 shell,那么zmv
几乎可以完全按照您想要的方式执行,并且语法非常相似:
zmv '*.download' '$1.html'
只是为了指出为什么你的尝试是错误和危险的:通配符*?
由你的 shell 扩展前该命令甚至被调用。因此,mv
实际上接收的是整个文件列表而不是*.download
,但*.html
有两种行为方式(两种方式都很糟糕):
如果*.html
不存在,您的 shell 会将星号保留为文件名的一部分。您正尝试将所有下载内容移动到名为 的同一文件中*.html
。mv
警告您它不是一个目录(否则您将多次覆盖此文件并最终*.html
包含上次下载的文件)。如果*.html
确实找到一个或多个文件,shell 会将其扩展为文件列表。希望它们都不是目录,因此由于同样的原因,这再次失败。
请注意,您非常幸运,您可能会以这种方式丢失数据。