文件上的质量 mv 和更改文件名

文件上的质量 mv 和更改文件名

我想更改这些文件名

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 中的单个目录。这里的一个选项是使用prenamerename在大多数系统上链接到此,但不是全部):

prename -n 's/download$/html/' -- *.download

-n当您确定这符合您的要求时,请将其删除。另一种方法是简单地使用循环:

for file in *.download; do
  mv -i -- "$file" "${file%download}html"
done

-i添加该选项mv以提示是否有文件将被覆盖。如果您确定不会覆盖您需要的任何文件,请将其删除。

答案2

mv这样行不通。您需要另一个工具,例如renamemmv。请注意,周围有两个版本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 会将星号保留为文件名的一部分。您正尝试将所有下载内容移动到名为 的同一文件中*.htmlmv警告您它不是一个目录(否则您将多次覆盖此文件并最终*.html包含上次下载的文件)。如果*.html确实找到一个或多个文件,shell 会将其扩展为文件列表。希望它们都不是目录,因此由于同样的原因,这再次失败。

请注意,您非常幸运,您可能会以这种方式丢失数据。

相关内容