【问题标题】:How can I rename files only if they don't match a pattern? [duplicate]仅当文件与模式不匹配时,如何重命名文件? [复制]
【发布时间】:2021-10-16 13:33:44
【问题描述】:

我想通过将“-renamed”附加到扩展名之前的基本名称来重命名文件,但我也不想重命名已经具有“-renamed”字符串的文件。

例如,

IMG_1234.jpg -> IMG_1234-renamed.jpg
IMG_1235.mp4 -> IMG_1235-renamed.mp4
IMG_1236-renamed.jpg -> no change

对于第一部分,我有以下工作:

for f in *.jpg; do mv $f ${f%.jpg}-renamed.jpg; done
for f in *.mp4; do mv $f ${f%.mp4}-renamed.mp4; done

我如何确保后续运行不会创建不断添加字符串?

IMG_1234-renamed.jpg -> IMG_1234-renamed-renamed.jpg
IMG_1235-renamed.mp4 -> IMG_1235-renamed-renamed.mp4

【问题讨论】:

    标签: bash file rename


    【解决方案1】:

    使用扩展通配符:

    #!/bin/bash
    shopt -s extglob
    for f in !(*-renamed).@(jpg|mp4) ; do
        new=${f%.*}
        new+=-renamed.${f##*.}
        if [[ -e $new ]] ; then
            echo Skipped: "$new" already exists. >&2
        else
            mv "$f" "$new"
        fi
    done
    
    • !(*-renamed) 将匹配不以 -renamed 结尾的任何内容;
    • @(jpg|mp4) 匹配 jpgmp4
    • ${f##*.} 返回扩展名(即使基本名称包含多个点)。
    • 另外,请引用您的变量,以便脚本适用于包含空格的文件名。
    • 此外,请检查目标文件是否存在,以免意外覆盖以前重命名的文件。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2020-10-02
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多