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

时间:2018-03-12 18:13:56

标签: bash macos 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

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

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

6 个答案:

答案 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开关)
或者使用

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

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

warning 还有其他同名工具可能会或可能不会这样做,所以要小心。

如果您运行以下命令(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