我有一组相当复杂的文件需要找到并做出反应(例如复制到文本文件的路径):
例如:
find / \( -iname "*ssh*" -or -iname "*scp*" \) \( -not -path -"/run" -not -path "/rw/*" -and -not -path "/home/*" -and -not -path "*/qml/*" \) >> ~/files.txt
在这里我想找到与“ssh”和“scp”相关但不在 /run 或 /rw 目录中的所有文件或文件夹。
我将为此添加更多条件,但命令太长了。我怎样才能用正则表达式做到这一点?
最好是根本不要下降到您想要排除的那些目录中,而不是在事后使用以下命令过滤掉其中的文件
! -path <pattern>
:这里使用POSIX
find
语法。对于 GNUfind
,这可能是:使用 BSD
find
,您只需使用-E
类似 ingrep
或sed
即可获取 POSIX ERE:这是一个带有换行符的版本,更容易阅读,并且修复了一些拼写错误。我假设 GNU 查找,但稍作修改也适用于大多数 BSD 查找。
现在为了简化一点,
-iname "*ssh*" -or -iname "*scp*"
可以写成正则表达式,例如现在您可以更轻松地添加额外的名称,例如
(ssh|scp|rsync|...)
.这些
-not -path
测试可以组合成一个正则表达式,如下所示:但
find
仍然会浪费大量时间探索这些目录,除非您使用-prune
: