![删除文件名中点之前的 2 个字符](https://linux22.com/image/173124/%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%82%B9%E4%B9%8B%E5%89%8D%E7%9A%84%202%20%E4%B8%AA%E5%AD%97%E7%AC%A6.png)
我在文件夹中有很多文件名,例如xxxxxxxxx.zip
如何使用 shell 脚本删除所有文件中点之前的最后 2 个字符。
例如abcd12345678.zip
abcd123456.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 个字符。