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

Tor*_*uun 12 command-line filename batch-rename

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

没有那么多视频文件,所以我可以在一般批量重命名为 JPG 之前或之后手动重命名它们。

为了让事情变得更复杂,文件名包含空格,所以我不能仅仅mv "*" "*.jpg"因为,嗯,这不起作用(但这就是我要做的,来自 DOS/Windows)。

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

请不要说“不要使用空格”,因为这真的不是我要问的。谢谢。

ste*_*ver 21

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

rename -nv -- 's/$/.jpg/' *
Run Code Online (Sandbox Code Playgroud)

或者

for file in *; do echo mv -- "$file" "$file.jpg"; done
Run Code Online (Sandbox Code Playgroud)

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

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


ter*_*don 9

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

  1. 环球之星

    shopt -s globstar
    for f in **/*; do [ -f "$f" ] && mv "$f" "$f".jpg; done
    
    Run Code Online (Sandbox Code Playgroud)

    [ -f "$f" ] &该保证mv命令只对文件和目录不运行。

  2. find

    find . -type f -print0 | xargs -0 -I{} mv "{}" "{}".jpg
    
    Run Code Online (Sandbox Code Playgroud)

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

    xargs获取输入列表并运行其上给出的命令。该-0标志告诉它期望以空分隔的输入,-I{}并将使其替换为每个{}传递的输入记录(在这种情况下为文件)的每个实例。


小智 5

man rename在尝试之前参考

这应该像一个魅力。

在终端中:

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

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

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

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

cd /path/to/exported/imgs/folder/
Run Code Online (Sandbox Code Playgroud)

所述sexpresion前表示的取代

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

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

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

并替换添加到它。一个点.jpg

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

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

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