我有一个用于清理数据文件的脚本
命令:
for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`
我尝试在没有该功能的情况下运行该命令grep -v
,但没有发现任何差异。
我想知道它的grep -v "^.$"
作用是什么。我没有创建这个脚本,并且在网上找不到任何内容。
答案1
grep -v "^.$"
将打印输入中的所有行,除了那些只有单个字符的行。
因为它用于:
find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"
我们可以假设它是从的输出中丢弃当前工作目录(.
) (使用相对路径时显示),这可以通过选项轻松实现,尽管这里它是多余的,因为您在 中使用绝对路径。find
.
-mindepth 1
find
稍后您只搜索data-
名称中带有 的文件grep data-
,这也是多余的。您可以将所有逻辑放在一次find
调用中:
find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print
也删除-print
,这是默认操作:
find /ddomain/data/shop12/ -name '*data-*' -mtime +15
请注意,如果您只查找文件,-type f
也请添加:
find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15
答案2
正如其他人已经说过的,grep -v '^.$'
过滤掉仅由一个字符组成的行(由行开头 ( ^
) 后跟一个字符 ( .
) 后跟行结尾 ( $
) 组成的行。另一种编写方式是grep -vx .
其中,-x
使^
和$
隐式(.
整行匹配)。
关于输出:
find /ddomain/data/shop12/ -mtime +15 -print
这没有什么意义,因为该命令的输出find
通常由以下行组成:
/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...
该输出包含单个字符的行的唯一方法是如果存在名称类似于foo<newline>X<newline>
.这是完全有可能的,但我想说这不太可能是该命令的意图。
该命令可能(错误地)改编自:
find . -mtime +15 -print | grep -v '^.$' | grep data-
其grep
目的是过滤掉.
条目(即使这样,grep -Fvx .
也会更合适)。然而,这样写会更有意义:
find . ! -name . -path '*data-*' -mtime +15
如果你想用 过滤掉顶级目录find /ddomain/data/shop12/
,你可以这样做:
find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15
或者,如果您的find
实现支持-mindepth
谓词:
find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15
答案3
.
它从结果列表中删除该目录find
。通过一个例子更容易解释:
find . -print
.
./prova2
./prova2/prova2
find . -print | grep -v '^.$'
./prova2
./prova2/prova2
正如您所看到的,在第一段代码中,我们找到了.
结果。因此,您将其传递给循环所采取的操作for
。在第二个代码片段中,您决定从 的结果中
跳过该目录,因此您不会将其发送到循环。.
find
for
答案4
grep -v '^.$'
排除只有一个字符的行。
例子:
echo "foo
> bar
> x" | grep -v '^.$'
foo
bar