我试图运行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