我正在尝试编写一个脚本来从目录中删除文件。
find /home/docs/* -name "*.log" -type f -print -exec rm -f {} \;
上面的方法有效,但是我需要使用 grep 来使用 grep 来定位目录。当我输入 grep 时,我会失败。
find /home/docs/* -name "*.log" -type f | grep -i "Testing"-print -exec rm -f {} \;
目录结构。
/home/docs/2023/01/Testing/
/home/docs/2024/01/Testing/
/home/docs/2024/02/Approve/
/home/docs/2022/01/Testing/
我需要log
从Testing
目录中删除。我可以将 grep 与 find 一起使用,但是当我尝试使用-exec
它来删除文件时,我收到错误。我尝试了很多不同的组合。
仅列出文件find /home/docs/* -name "*.log" -type f | grep -i "Testing"
获取文件列表
/home/docs/2023/01/Testing/3.log
/home/docs/2023/aisle/drawing/01/Testing/2.log
/home/docs/2023/drawing/Testing/1.log
添加 -exec 不会删除find /home/docs/* -name "*.log" -type f | grep -i "Testing" -exec rm -f {} \;
此迭代我没有收到错误grep: {}: No such file or directory
你不需要
grep
;你需要阅读 的手册页find
;man find
!在那里,您会发现(通过输入搜索“regex” /
regex
)-iregex
您可以仅与正则表达式进行匹配。但是,您甚至不需要正则表达式!而且您还会发现无需以下操作即可完成删除
-exec
:就是这样。没有奇怪的极端情况,没有换行问题,没有调用
grep
。如果你真的需要正则表达式:
但是,对于您的问题,您根本不需要正则表达式。
事实上,你甚至不需要
find
!您的 shell 可以很好地完成此任务(自动完成文件名):在
bash
(可能是您正在使用的 shell,除非您另外知道)中,一个简单的会做的。在 中
zsh
,您甚至不需要设置任何特殊选项,因此只要rm -f /home/docs/(#i)**/*Testing*/*.log(.)
您正在使用zsh
并已extendedglob
启用即可。这(#i)
使得 glob 的其余部分匹配不区分大小写²,尾部(.)
仅匹配常规文件。¹ 请注意,这
/home/docs/**/Testing/**/*.log
不会被发现/home/docs/x/testing/file.log
,因为只有/
具有 glob 运算符的 - 分隔组件才会受到nocaseglob
./home/docs/**/[T]esting*/**/*.log
例如,您需要Testing
不区分大小写地匹配。这与 zsh 不同(#i)
² 将其更改
/home/docs/**/*((#i)Testing)*/*.log(.)
为不区分大小写,仅适用于Testing
(而不是log
)。其中之一。(第一个适用于许多平台,第二个适用于所有平台。)
如果您的第一个示例目录结构正确,则简单的 shell glob 扩展可以更轻松地工作(假设没有“太多”文件与扩展匹配:
正如您帖子的评论中提到的:
find
,而无需使用grep
-exec
这不是您可以传递给的选项grep
但是,如果您无论如何都想使用
grep
,我建议使用xargs
,如下所示:或者,即使路径中存在空格、引号、撇号或反斜杠字符的文件也能正常工作: