使用正则表达式在shell中查找命令以查找具有两个扩展名的文件

时间:2015-12-16 06:16:57

标签: regex linux shell

我正在尝试从应用服务器列出生成的日志和zip文件。

  • .log或.zip文件
  • 这些文件包含其名称中的数字。即名称中包含任意位数的文件
  • 文件应早于+5天。

我用下面的表达方式。但看起来有些不对劲。你能帮助正规表达吗?

ROOT_DIR=applications/jboss-as/servers/
find $ROOT_DIR -name '*[0-9]*[zip|log]' -mtime +5

最后,我希望使用命令

删除这些文件
find $ROOT_DIR -name '*[0-9]*[zip|log]' -mtime +5 -exec rm {} \;

2 个答案:

答案 0 :(得分:1)

第一个命令将找到它们并显示。

find $ROOT_DIR ! -readable -prune -mtime +5 -type f |  egrep -e "^.*\.(log|zip)$"

第二个将删除所有

find $ROOT_DIR ! -readable -prune -mtime +5 -type f |  egrep -e "^.*\.(log|zip)$" | xargs -L 1 rm

答案 1 :(得分:0)

你可以这样做(大多数版本的find):

find "$ROOT_DIR" '(' -name '*[0-9]*.log' -o -name '*[0-9]*.zip' ')' -mtime +5 -exec rm {} +

+来自POSIX 2008,意味着"运行exec&#d; d命令,文件名和方便的文件名一样多。而较旧的替代';'(或\;)表示"每个文件名运行一次exec&#d; d命令"。

如果你有GNU find,你可以使用正则表达式的各种方言:

find "$ROOT_DIR" -regex '.*\.\(zip\|bz2\)' -mtime +5 -delete

这使用默认的正则表达式模式;您可以使用一些替代方法来避免使用这么多反斜杠。 -delete选项使用unlink()系统调用而不是调用外部命令;因此,它更有效率。