Bash - For循环,排除在filetype前面的文件名中具有特定模式的文件



我试图运行for循环,但试图排除文件名中具有特定模式的文件。下面是我使用的命令:

for file in /home/ubuntu/discovery/download/*![.en].mp4; do

我想要包含这个文件名:

Blub - S03E10 - Nervous Breakdown.mp4

但是这个文件名要排除

Blub - S03E10 - Nervous Breakdown.en.mp4

不能让它工作。我做错了什么?

Thanks in advance

我做错了什么?

标准globbing没有分组或组否定操作符(尽管扩展版本有这些操作符)。在您的特定上下文中,我只会过滤掉循环中不需要的文件:

for file in /home/ubuntu/discovery/download/*.mp4; do
case $file in
*.en.mp4) continue;;
esac
# ...
done

这应该可以在任何Bourne-family shell中工作,而不仅仅是Bash。

另一种选择是:

shopt -s nullglob
for file in /home/ubuntu/discovery/download/*{[^n],[^e]n,[^.]en}.mp4
do
# ...
done

路径名扩展:"match not">extglob启用:

!(pattern-list)
Matches anything except one of the given patterns

试试这个:

for file in /home/ubuntu/discovery/download/!(*.en).mp4; do
...

另一种方法是遍历所有文件,跳过任何具有不需要的名称模式的文件。只要确保还处理没有找到文件的情况,因为在这种情况下,file被设置为等于glob模式。通常您可以通过验证file中的路径是否实际存在(-e "${file}")来处理这种情况。

for file in /home/ubuntu/discovery/download/*.mp4; do
[[ -e "${file}" && "${file}" != *.en.mp4 ]] || continue
echo ${file}
done

相关内容

  • 没有找到相关文章

最新更新