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命令
如果您有更复杂的层次结构,则需要稍微复杂一些的方法。您可以使用 bash 的globstar选项来**匹配零个或多个目录和子目录,也可以使用find.
环球之星
shopt -s globstar
for f in **/*; do [ -f "$f" ] && mv "$f" "$f".jpg; done
Run Code Online (Sandbox Code Playgroud)
在[ -f "$f" ] &该保证mv命令只对文件和目录不运行。
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/' *