如何批量添加文件扩展名?

如何批量添加文件扩展名?

我的照片导入器从相机中移动文件并重命名,但我忘了指定保留文件扩展名。因此我有几个文件夹,里面有数百个 JPG 和 AVI 文件,但它们都缺少正确的扩展名。

视频文件并不多,因此我可以在将其批量重命名为 JPG 之前或之后手动重命名它们。

为了使事情变得更加复杂,文件名包含空格,所以我不能这样做,mv "*" "*.jpg"因为,嗯,这不起作用(但这是我从 DOS/Windows 中所做的)。

我知道 Linux 有很多强大的命令。当文件包含空格时,如何批量重命名文件以添加 .jpg 扩展名?

请不要说“不要使用空格”,因为那实际上不是我所问的。谢谢。

答案1

如果使用得当,即使名称中有空格,Shell globs 也应该可以正常工作,例如

rename -nv -- 's/$/.jpg/' *

或者

for file in *; do echo mv -- "$file" "$file.jpg"; done

n[注意:在交换机或被移除之前,这些都是“无操作” echo- 因此您可以在提交之前检查正确的替换]

如果你确实想自动区分 jpg 和 avi 文件,也可以使用更复杂的循环和filemimetype命令

答案2

如果你有更复杂的层次结构,你需要一个稍微复杂的方法。你可以使用 bash 的globstar选项它可以**匹配零个或多个目录和子目录,或者您可以使用find

  1. 全球星

    shopt -s globstar
    for f in **/*; do [ -f "$f" ] && mv "$f" "$f".jpg; done
    

    确保[ -f "$f" ] &命令mv仅在文件上运行,而不是目录。

  2. find

    find . -type f -print0 | xargs -0 -I{} mv "{}" "{}".jpg
    

    -type f确保我们只找到文件而不找到目录,并且打印输出的print0原因find用空字符 ( \0) 而不是换行符分隔。这确保我们正确处理包含空格或换行符或其他奇怪内容的文件名。

    xargs获取输入列表并对其运行给定的命令。-0标志告诉它期望以空分隔的输入,并且将使它用传递的每个输入记录(在本例中为文件)-I{}替换每个实例。{}

答案3

man rename尝试之前请先参考

这应该会非常有效。

在终端中:

cd /path/to/exported/imgs/folder/
rename  's/(\w+)$/$1\.jpg/' *

请将“jpg”更改为您需要的内容。

rename可以使用 perl 表达式.. 你最好的朋友

在第一行你输入了你的文件目录

cd /path/to/exported/imgs/folder/

之前的表达式s表示替换

改名 '秒/(\w+)$/$1\.jpg/' *

然后将搜索任何具有字母数字和下划线名称但没有扩展名的文件

重命名 's/(\w+)$/$1\.jpg/' *

并替换添加。a dot jpg

重命名 's/(\w+)$/$1\.jpg/'*

最后应用于第一行文件夹中的任意文件

重命名's/(\w+)$/$1\.jpg/'*

答案4

我在管理系统时经常遇到这种情况,尤其是在处理由 Windows 应用程序创建的文件名时。要为.jpg没有任何扩展名的文件名添加扩展名,请考虑此命令列表。

find ./example -type f -name '*' -print0 | xargs -0 -I'{}' mv '{}' '{}'.jpg

find-print0会生成 NULL 字符作为分隔符,而 xargs 则-0接受这些 NULL 分隔符。它还会对所有子目录执行此操作,因此请务必替换该“./example”路径。

rename是一个很棒的命令,但它的实现和规范都是特定于发行版的。我通常rename在命令行上使用类似的东西,但我总是用 GNU 实用程序标准编写我的脚本。

相关内容