Bash循环删除与名称结构匹配的文件

时间:2018-08-14 20:47:42

标签: bash file loops terminal

使用bash循环,我要删除文件夹中三种文件名之一

1)L4.mp3

2)L4与Music.mp3

3)L4 noIntro with Music.mp3

这三种类型的文件很多,唯一改变的是L后面的数字

我想: 保留任何名称如 1 的文件(原始文件)

保留任何名称如 3 (已添加音乐并删除了简介)的文件

删除所有名称类似于 2 的文件(添加了音乐但不介绍音乐)

最好的方法是什么?

我最初的想法(始终无法编译)是:

for file in *.mp3; do
name=${file%%[.]*};
if name !=  "$*trimmed wMusic.mp3";
then
rm file;
fi
done

但输出为:

-bash: name: command not found

-bash: name: command not found

-bash: name: command not found

-bash: name: command not found

1 个答案:

答案 0 :(得分:2)

不确定为什么需要循环,但是这里有一些建议:

ls *.mp3 | grep '(1)' | xargs -d"\n" rm

这将获取所有带有表达式(1)的.mp3文件,例如abc(1).mp3等

如果您想在方法上获得更广泛的影响或更具动态性,我建议在grep中使用regex:

ls *.mp3 | grep -P "regex-here" | xargs -d"\n" rm

如果您要删除其他几种类型的文件,例如mp4等在同一命令中,然后使用:

ls *.{mp3,mp4,mpeg} | grep -P "regex-here" | xargs -d"\n" rm

您还可以使用正则表达式并借助查找删除:

find -iregex 'regex-here' -delete