我有一些包含日期和时间戳的文件,我想从输出中排除它们,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 参数更容易:)