我的照片导入器从相机中移动文件并重命名,但我忘了指定保留文件扩展名。因此我有几个文件夹,里面有数百个 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 文件,也可以使用更复杂的循环和file
或mimetype
命令
答案2
如果你有更复杂的层次结构,你需要一个稍微复杂的方法。你可以使用 bash 的globstar
选项它可以**
匹配零个或多个目录和子目录,或者您可以使用find
。
全球星
shopt -s globstar for f in **/*; do [ -f "$f" ] && mv "$f" "$f".jpg; done
确保
[ -f "$f" ] &
命令mv
仅在文件上运行,而不是目录。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 实用程序标准编写我的脚本。