我正在尝试在当前目录中查找包含名称报告且不以扩展名 .log 结尾的所有文件 有什么方法可以使用正则表达式单次查找相同的文件吗?
到目前为止,这是我想出的:
ls -la | grep ".*report*" | grep -v ".log"
但我想知道我是否可以在下面的行中实现相同的目标
ls -l .*report*[^.log]
我知道 [^.log] 不会过滤掉扩展名为 .log 的文件,如何使用正则表达式实现相同的效果。我正在使用 BASH 顺便说一句。谢谢。
您可以为此使用 extglob。例如:
shopt -s extglob nullglob
files=( report!(*.log) )
...对于测试,当然,您可以使用ls
(尽管它不应该在脚本中使用):
shopt -s extglob
ls -l report!(*.log)
...将查找所有以 开头report
但不以 结尾的文件.log
,并将它们的名称放入名为files
. 如果没有文件匹配,设置该nullglob
选项将阻止模式本身作为结果返回。
然后,您可以执行以下操作来检查数组的内容:
if (( ${#files[@]} )); then
echo "Found some files that need to be deleted!"
rm -f "${files[@]}"
else
echo "Nothing but .log files for the reports"
fi
这是一个扩展的 glob 模式(shopt -s extglob
命令将它们打开;shopt -u extglob
再次关闭该扩展),而不是正则表达式。(类似*.log
的表达式也是全局模式,而不是正则表达式;类似的正则表达式看起来像.*[.]log
,这不是您在 shell 中使用的)。
如果您无论如何都要在这些文件上循环,跳过循环顶部的日志是微不足道的。
for f in *report*; do
case $f in *.log ) continue ;; esac
:
: do stuff with "$f" here
done
请注意,您应该"$f"
在大多数地方正确使用双引号,但在case
它们之后没有必要。
你可以说:
find . -type f \( -name "*report*" -a ! -name "*.log" \)
这将找到与模式匹配的文件,report
并排除以.log
当前目录和所有子目录结尾的文件。
如果只想在当前目录中查找,可以说:
find . -maxdepth 1 -type f \( -name "*report*" -a ! -name "*.log" \)
你可以做:
ls -ld !(*.log)
这将显示当前文件夹中不以 . 结尾的所有文件/目录.log
。
据我所知,没有办法同时过滤include *report*
+exclude .log
所以,一般来说,最干净的方法是:
ls -ald *report* | grep -v '\.log'