![如何从字符串中删除所有文件扩展名?](https://linux22.com/image/177919/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%EF%BC%9F.png)
我的文件名带有 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