从字符串中删除最后n个字符的单行方式

Tiw*_*ina 2 macos bash terminal command-line-interface

我有格式的一堆文件的photo.jpg.png文件夹中,并且此文件夹中的每一张照片,我想替换.jpg.png.png.我怎么能从终端这样做?

我有一个基本的Python和bash背景,所以我知道我想做这样的事情:

 $ for i in *.png; do mv $i $i[:-8]; done
 $ for i in *; do mv $i $i.png; done
Run Code Online (Sandbox Code Playgroud)

但是[:-8]为了删除每个文件名的最后8个字符,我会用什么替换Pythonic 呢?

编辑我现在意识到从字符串末尾开始计算的子字符串会更好.还有办法做到这一点吗?

gho*_*oti 5

您可以使用模式扩展:

for f in *.jpg.png; do mv -v "$f" "${f/.jpg.png/.png}"; done
Run Code Online (Sandbox Code Playgroud)

虽然您可能仍然遇到类似文件名的问题foo.jpg.png.gif.

如果您真的要删除最后7或8个字符,可以使用子字符串扩展:

for f in *.jpg.png; do mv -v "$f" "${f:0:-7}png"; done
Run Code Online (Sandbox Code Playgroud)

请注意,在子字符串长度中使用负数需要bash版本4或更高版本.