如何从 bash 中的文件名中删除特定字符串

How to delete specific string from filename in bash

我有一个名为 "Some Text - Full Score_0.png" 的文件,我需要从中删除“- Full Score”部分,并将 "Some Text" 中的所有剩余空格替换为“-”。

我可以使用 tr ' ' '-'

删除所有空格

我需要输出为 "some-text_0.png"...

有没有人有想法,如何解决?

可以使用参数扩展:

#!/bin/bash
in='Some Text - Full Score_0.png'
expected='some-text_0.png'

out=${in/ - Full Score}  # Replace
out=${out// /-}          # Replace everywhere
out=${out,,}             # Lowercase all

[[ $expected == $out ]] && echo ok

我已经找到解决方法了!

"$file" | cut -d- -f1 | sed 's/.$//' | tr ' ' '-'

如果您发现其他更好的解决方案,请告诉我。

有一个名为 rename 的简洁命令行实用程序。它默认出现在 Ubuntu 中,但也可用于 Mac。

它的工作方式类似于 sed(1),但文件名:

$ touch 'Some Text - Full Score_0.png'
$ ls
Some Text - Full Score_0.png
$ rename -e 's/ - Full Score//; s/ /-/g; y/A-Z/a-z/' Some\ Text\ -\ Full\ Score_0.png 
$ ls
some-text_0.png

s/ - Full Score// 删除有问题的文本。

s/ /-/g 用连字符替换空格。

y/A-Z/a-z/ 将所有字母小写。