繁体   English   中英

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

[英]One-line way to remove last n characters from string

我在文件夹中有一堆格式为photo.jpg.png的文件,对于这个文件夹中的每张照片,我想用.png替换.jpg.png 我怎么能从终端这样做?

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

 $ for i in *.png; do mv $i $i[:-8]; done
 $ for i in *; do mv $i $i.png; done

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

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

您可以使用模式扩展:

for f in *.jpg.png; do mv -v "$f" "${f/.jpg.png/.png}"; done

虽然您可能仍然遇到像foo.jpg.png.gif这样的文件名的问题。

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

for f in *.jpg.png; do mv -v "$f" "${f:0:-7}png"; done

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

使用Perl的独立rename命令:

rename -n 's/jpg\.png$/png/' *.jpg.png

要么

rename -n 's/.......$/png/' *.jpg.png

输出:

rename(photo.jpg.png, photo.jpg)

如果一切正常,请删除`-n'。

rename是为这种事物而设计的;

$ rename .jpg.png .png *.jpg.png

对于MacOS,我意识到默认情况下可能无法使用rename ,您可以使用brew安装它。

$ brew install rename

然后使用-s选项rename ;

$ rename -s .jpg.png .png *.jpg.png

使用perl的重命名删除最后8个字符:

$ rename -n 's/.{8}$//' *.png

(当你的测试没问题时删除-n开关)
或者使用

for i in *.png; do
    echo mv "$i" "${i:0:-8}"
done

(当你的测试没问题时删除echo

警告 还有其他具有相同名称的工具可能会或可能不会这样做,所以要小心。

如果您运行以下命令( GNU

$ file "$(readlink -f "$(type -p rename)")"

你有一个结果

.../rename: Perl script, ASCII text executable

并且不包含:

ELF

那么这似乎是正确的工具=)

如果没有,为了使它成为Debian上的默认(通常已经是这种情况)和Ubuntu这样的派生:

$ sudo update-alternatives --set rename /path/to/rename

(将/path/to/rename替换为perl's rename命令的路径。


如果您没有此命令,请搜索包管理器以进行安装或手动执行


最后但并非最不重要的是,这个工具最初是由Perl的父亲Larry Wall编写的。

像这样的东西:

$ v=test.jpg.png
$ echo ${v:0:-8}
test

这应该工作:

for file in *.jpg.png; do mv $file ${file//jpg.png/jpg} ; done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM