[英]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开关)
或者使用bash :
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.