从搜索中过滤文件

从搜索中过滤文件

我有一些包含日期和时间戳的文件,我想从输出中排除它们,ls如下所示:

 test.log.15-05-25_20:41:05.20150611
 test.log.15-05-27_20:28:32.20150611
 test.log.15-05-26_20:29:40.20150611
 test.log.
 test-file~df_gp~1.log.
 test.log.20150616
 test.log.15-05-28_20:28:27.20150616
 test.log.15-05-27_20:28:32.20150616
 test.log.15-05-26_20:29:40.20150616
 test.log.15-05-25_20:41:05.20150616
 test-bat-test.log.

并且输出应仅列出以下文件,这意味着应省略任何包含日期和时间戳的文件

 test.log.
 test-file~df_gp~1.log.
 test-bat-test.log.

有没有办法可以做到这一点?

答案1

你可以使用 GNU find

 find * -regextype posix-extended \! -regex '.*[0-9]{8}.*' -prune

如果日期始终位于字符串的末尾,并且前面带有.,您还可以使用正则表达式.*\.[0-9]{8}来反映这一点并降低错误排除文件的风险。

怎么运行的 :

  • -regextype posix-extended选择适合下面正则表达式的正则表达式类型
  • \!否定其后面的语句的含义
  • -regex '.*[0-9]{8}.*'匹配任何具有八个连续数字的文件(即形式的日期20150616
  • -prune防止find列出子目录

其他选项:

  • 添加-f仅列出文件的选项

编辑:

在不支持正则表达式的 AIX 上find,您可以使用以下内容(使用标准的全局机制):

find * \! -name '*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*' -prune

或者,如果日期始终位于字符串的末尾,并且前面有 a .,则可以使用以下模式:*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

编辑2:

如果您希望文件以 开头test,您可以使用:

find * -prune -type f \! -name 'test*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

如果您不想通过 shell 使用文件名扩展并且该目录中没有其他目录,您还可以使用:

find . -type f \! -name 'test*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

答案2

我通常用来| grep -v过滤掉我不想要的行。如果 grep 没有删除足够的内容,我会添加另一个:

$ ls | grep -v 2015 |grep -v 2014

这比必须记住 find 的正则表达式 posix 参数更容易:)

相关内容