我有一个充满jpg文件的文件夹,所有文件都以" -x-large.jpg"结尾。我想使用命令行重命名它们,以便它摆脱-x-large而只是变成.jpg。
所以例如123-x-large.jpg将成为123.jpg
有人可以告诉我如何使用ren命令执行此操作吗?
感谢。
答案 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
将扩展到命令行)。您可以使用find
和xargs
解决此问题,如下所示:
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