我正在运行OS X 10.8.5,因此rename
命令不是一个选项,我编码的内容与 bash 的其余内容相符脚本正在这样做我宁愿留在这个框架内,但如果可能的话,稍微修改一下。我使用的是 bash 的更高版本,然后是OS X 10.8.5的默认发货,我使用的是GNU bash 4.3.30,我是从源代码安装的。 (是的,我知道我背后有一些补丁。)
如果可能,我在下面的功能中要做的是替换mv
命令目标在纯bash 中使用命令替换并使用其他东西的参数。更具体地说,我希望不再使用管道和外部可执行文件。
问题 命令替换我可以修改或替换为文件名扩展和模式匹配不使用管道或外部可执行文件来实现我的既定目标? (或其他更合理的东西。)
我已经阅读了Bash参考手册中的三个相关章节,但我不得不承认我没有看到它是如何可能的。虽然我确实尝试重新编码了几次,但输出完全不是我想要的,但是它被修改了文件名或错误... bad substitution
。
工作目录中的所有目标文件名已经匹配RegEx.$ext
或RegEx+foobar.$ext
以及我&#39的方式;已编码功能并使用mv
,如果它尚未与RegEx
匹配,则会从{{1}重命名目标文件名 1}}到RegEx+foobar.$ext
。截断时,所有文件名将是唯一的,因此无需担心覆盖现有的RegEx.$ext
文件名,因此无需额外错误检查需要。
示例文件名: filenameC01P01.png filenameC01P02foobar.jpg filenameC01P03.tif
预期输出: RegEx.$ext
- > filenameC01P02foobar.jpg
代码:
filenameC01P02.jpg
答案 0 :(得分:3)
您似乎只想在CxxPxx
模板后删除任何内容,但保留扩展名。
# Capture both the good part and the trailing garbage
[[ ${f%.*} =~ (.*C[0-9]{2}P[0-9]{2})(.*)$ ]]
if [[ -n ${BASH_REMATCH[2]} ]]; then
mv -v "$f" "${BASH_REMATCH[1]}.$ext"
fi
您也可以捕获正则表达式中的扩展名,无需单独提取它。
[[ $f =~ (.*C[0-9]{2}P[0-9]{2})(.*)\.(.*)$ ]]
if [[ -n ${BASH_REMATCH[2]} ]]; then
mv -v "$f" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}"
fi