删除文件名中点之前的 2 个字符

删除文件名中点之前的 2 个字符

我在文件夹中有很多文件名,例如xxxxxxxxx.zip

如何使用 shell 脚本删除所有文件中点之前的最后 2 个字符。

例如abcd12345678.zipabcd123456.zip

答案1

在 shell 内部,您可以使用变量扩展。

如果 fname 包含文件名(abcd12345678.zip例如),您可以执行以下操作:

fname=abcd12345678.zip
ftail=${fname##*.}
fnew=${fname%??".$ftail"}

echo mv "$fname" "$fnew.$ftail"

处理一个目录中的所有文件(检查文件是否已存在):

for fname in *.zip; do
    ftail=${fname##*.}
    fnew="${fname%??".$ftail"}.$ftail"

    if [ -e "$fnew" ]; then
        echo "File $fnew already exist, not moving"
    else
        echo mv "$fname" "$fnew"
    fi
done

当您确信它可以正常工作时,请删除echo前面的 来实际移动文件。echo mv ....

答案2

关于什么rename

rename 's/..\././g' abcd12345678.zip

sed语法与 的语法相同。

答案3

流行的 Bash shell 允许在测试=~中使用运算符来测试正则表达式[[。假设变量f包含以下内容:

$ echo "$f"
abcd12345678.zip

您可以这样匹配最后一位数字:

$ [[ "$f" =~ (.*)..\.zip ]] && echo "${BASH_REMATCH[1]}".zip
abcd123456.zip

或者甚至可以通过这种方式使其更加抽象:

$ [[ "$f" =~ (.*)..(\.zip) ]] && echo "${BASH_REMATCH[1]}""${BASH_REMATCH[2]}"

要重命名,请使用mv.

答案4

zsh

autoload -Uz zmv # best in ~/.zshrc
zmv -n '(*)??(.*)' '$1$2'

高兴时删除-n(用于空运行)。

如果文件名包含多个点,则会删除最后一个字符之前的 2 个字符。

相关内容