我正在尝试查找当前目录中包含名称报告的所有文件,而不是以扩展名.log结尾 有没有什么方法可以使用正则表达式一次性找到相同的东西?
这是我到目前为止所提出的:
ls -la | grep ".*report*" | grep -v ".log"
但我想知道我是否可以在下面的线上实现相同的东西
ls -l .*report*[^.log]
我知道[^ .log]不会过滤掉.log扩展名的文件,如何使用正则表达式实现同样的目的。我正在使用BASH btw。感谢。
答案 0 :(得分:2)
你可以说:
find . -type f \( -name "*report*" -a ! -name "*.log" \)
这将找到与模式report
匹配的文件,并排除当前目录和所有子目录中以.log
结尾的文件。
如果您只想在当前目录中找到,可以说:
find . -maxdepth 1 -type f \( -name "*report*" -a ! -name "*.log" \)
答案 1 :(得分:2)
你可以使用一个extglob。例如:
shopt -s extglob nullglob
files=( report!(*.log) )
...对于测试,当然,您可以使用ls
(尽管shouldn't be used in scripts):
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
这样的表达式也是glob模式,而不是正则表达式;类似的正则表达式看起来像.*[.]log
,而这不是你在shell中使用的。)
答案 2 :(得分:2)
如果你要在这些文件上驱动一个循环,那么跳过循环顶部的日志是微不足道的。
for f in *report*; do
case $f in *.log ) continue ;; esac
:
: do stuff with "$f" here
done
请注意,您应该在所有地方的双引号中正确使用"$f"
,但在case
之后它们不是必需的。
答案 3 :(得分:1)
你可以这样做:
ls -ld !(*.log)
这将显示当前文件夹中的所有文件/目录不以.log
结尾。
据我所知,无法同时过滤include *report*
+ exclude .log
因此,一般来说,最干净的方法是:
ls -ald *report* | grep -v '\.log'