命令行批量重命名Jpg文件

时间:2017-12-14 09:47:49

标签: command-line

我有一个充满jpg文件的文件夹,所有文件都以" -x-large.jpg"结尾。我想使用命令行重命名它们,以便它摆脱-x-large而只是变成.jpg。

所以例如123-x-large.jpg将成为123.jpg

有人可以告诉我如何使用ren命令执行此操作吗?

感谢。

2 个答案:

答案 0 :(得分:0)

for img in *-x-large.jpg; do mv -i -v "$img" "${img%-x-large.jpg}.jpg"; done

这会在所有匹配的图像上循环,并将它们移动到一个带有截断名称的新文件(从末尾删除-x-large.jpg),并将.jpg添加回文件名的末尾。我正在用mv -i以交互方式调用它,因此在覆盖每个文件之前会提示您。要强制覆盖(总是说“是”),请将其更改为mv(删除-i)。为防止覆盖(总是说“不”),请将其更改为mv -n

如果您不想看到每次重命名,请删除-v(详细)。

如果您拥有大量这些文件,命令行对于上述命令来说太长了(因为*-x-large.jpg将扩展到命令行)。您可以使用findxargs解决此问题,如下所示:

sh <(find . -maxdepth 1 -name '*-x-large.jpg' \
  |sed -r 's/(.*)(-x-large.jpg)$/mv -i "\1\2" "\1.jpg"/')

这会使用bash process substitution创建一个shell脚本,使用find生成我们要重命名的所有文件的列表,然后通过sed管道创建mv }命令 (请参阅上面的mv标记。我删除了-v,因为这可能是一个非常长的列表。)
如果要在运行脚本之前检查脚本,请参阅下面的版本。

以上单线程需要GNU bash或Korn shell(ksh)以及GNU sed。
以下是两种方法(三个命令中):

find . -maxdepth 1 -name '*-x-large.jpg' \
  |sed 's/.*/mv "&" "&/; s/-x-large.jpg$/.jpg"/' > temp.sh
sh temp.sh
rm temp.sh

Posix sed无法可靠地支持捕获组(\(…\)sed -r来调用ERE),因此我们不能指望它能够匹配和回忆文本,所以这个版本只是写了大部分命令,然后修复了结尾(第一次替换中没有尾随的双引号是故意的;我们在第二次替换中添加它)。 Posix shell/bin/sh本身)不支持进程替换,因此我们转储到临时文件,对其进行评估,然后将其删除。

答案 1 :(得分:0)

如果我们引用Windows命令行,那么SET /?就是您的朋友。那里有很多好消息。

setlocal ENABLEDELAYEDEXPANSION
set SEARCH_SUFFIX=-x-large.jpg
set REPLACE_SUFFIX=.jpg
for %%A in ("*%SEARCH_SUFFIX%") do (
    set OLD_NAME=%%~nxA
    set NEW_NAME=!OLD_NAME:%SEARCH_SUFFIX%=%REPLACE_SUFFIX%!
    ren "!OLD_NAME!" "!NEW_NAME!"
)
endlocal