我在文件夹中有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
但是为了删除每个文件名的最后8个字符,我会用什么替换Pythonic [:-8]
?
编辑我现在意识到从字符串末尾开始计算的子字符串会更好。还有办法做到这一点吗?
答案 0 :(得分:5)
您可以使用模式扩展:
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或更高版本。
答案 1 :(得分:1)
使用Perl的独立rename
命令:
rename -n 's/jpg\.png$/png/' *.jpg.png
或
rename -n 's/.......$/png/' *.jpg.png
输出:
rename(photo.jpg.png, photo.jpg)
如果一切正常,请删除`-n'。
答案 2 :(得分:1)
rename
专为此事而设计;
$ rename .jpg.png .png *.jpg.png
对于MacOS,我发现默认情况下rename
可能不可用,您可以使用brew
进行安装。
$ brew install rename
然后使用-s
的{{1}}选项;
rename
答案 3 :(得分:1)
使用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
命令的路径。
如果您没有此命令,请搜索软件包管理器进行安装或do it manually
最后但并非最不重要的是,这个工具最初是由Perl的父亲Larry Wall编写的。
答案 4 :(得分:0)
类似的东西:
$ v=test.jpg.png
$ echo ${v:0:-8}
test
答案 5 :(得分:0)
这应该有效:
for file in *.jpg.png; do mv $file ${file//jpg.png/jpg} ; done