如何从字符串中删除所有文件扩展名?

如何从字符串中删除所有文件扩展名?

我的文件名带有 MP4 扩展名,但不以以下结尾_special.MP4

mylist=$(ls | grep -v "_special.MP4")

然后,我想.MP4从后续列表中删除该扩展。

echo $mylist | sed -e 's/\.MP4$//'

只删除最后一个.MP4出现的情况,我怎样才能得到它们呢?

答案1

假设我有以下以 .MP4 结尾的文件:

.
├── 1.MP4
├── 2.MP4
└── 3_special.MP4

如果我理解正确,您需要非特殊文件的名称,减去 .MP4 扩展名。

首先,我会使用find而不是ls因为它更容易控制并且更容易解析输出。无论哪种方式,您最终都会得到一个由换行符分隔的文件列表:

$ find . -name '*.MP4' -not -name '*_special.MP4'
./1.MP4
./2.MP4

您的 sed 命令将按原样工作,因为$模式中的 绑定到每行的末尾:

$ find . -name '*.MP4' -not -name '*_special.MP4' | sed -e 's/\.MP4$//'
./1
./2

basename命令实际上会为您完成大部分工作;你甚至不需要sed!主要用途basename是从路径前面删除目录,但它也支持删除后缀。

概要

基本名称字符串[后缀]

basename只接受“字符串”位置中的单个单词,因此您需要使用 xargs 为每个文件运行一次。

$ find . -name '*.MP4' -not -name '*_special.MP4' | xargs -I -name- basename -name- .MP4
1
2

答案2

使用bash:

shopt -s extglob            # enable extglob
mylist=( !(*_special.MP4) ) # fill array but without files with suffix _special.MP4
echo "${mylist[@]%.MP4}"    # remove suffix .MP4

相关内容