0

我正在尝试在当前目录中查找包含名称报告且不以扩展名 .log 结尾的所有文件 有什么方法可以使用正则表达式单次查找相同的文件吗?

到目前为止,这是我想出的:

ls -la | grep ".*report*" | grep -v ".log"

但我想知道我是否可以在下面的行中实现相同的目标

ls -l .*report*[^.log] 

我知道 [^.log] 不会过滤掉扩展名为 .log 的文件,如何使用正则表达式实现相同的效果。我正在使用 BASH 顺便说一句。谢谢。

4

4 回答 4

2

您可以为此使用 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 中使用的)。

于 2013-07-23T12:08:14.640 回答
2

如果您无论如何都要在这些文件上循环,跳过循环顶部的日志是微不足道的。

for f in *report*; do
    case $f in *.log ) continue ;; esac
    :
    : do stuff with "$f" here
done

请注意,您应该"$f"在大多数地方正确使用双引号,但在case它们之后没有必要。

于 2013-07-23T12:15:31.783 回答
2

你可以说:

find . -type f \( -name "*report*" -a ! -name "*.log" \)

这将找到与模式匹配的文件,report并排除以.log当前目录和所有子目录结尾的文件。

如果只想在当前目录中查找,可以说:

find . -maxdepth 1 -type f \( -name "*report*" -a ! -name "*.log" \)
于 2013-07-23T11:52:14.433 回答
1

你可以做:

ls -ld !(*.log)

这将显示当前文件夹中不以 . 结尾的所有文件/目录.log

据我所知,没有办法同时过滤include *report*+exclude .log

所以,一般来说,最干净的方法是:

ls -ald *report*  | grep -v '\.log'
于 2013-07-23T11:37:07.903 回答