我需要将结果find
与正则表达式匹配。文件如下:
/path/1/file1.001.txt
/path/1/file2.001.txt
/path/1/file1.001
/path/2/file3.002.txt
/path/2/pure_file3.002.txt
ETC。
我需要匹配所有目录中以xxx.txt
wherexxx
是 3 位数字结尾的所有文件,并且仅匹配那些前面没有 word 的文件名pure_
。此外,我需要返回完整路径。
除了排除以下文件之外,我已经完成了所有工作pure_
:
find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.*\.[0-9]{3}.txt'
我试过:
find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.+(?!pure).*\.[0-9]{3}.txt'
但如果我说/path/1/
:
ls -1 | grep -P '^(?!pure).*\.[0-9]{3}.txt'
另一方面,正确排除这些文件:
ls -1 | grep -P '(?!pure).*\.[0-9]{3}.txt'
才不是。
所以它可能归结为,如何在完整路径中匹配不以pure_
.我对正则表达式的理解还不够,这可能与我从未理解的环视原子性有关。
答案1
find
没有正则表达式匹配:
find /path -type f ! -name 'pure_*' -name '*[0-9][0-9][0-9].txt'
这将在目录中或目录下找到/path
名称不pure_
以三位数字和 结尾的任何常规文件.txt
。
答案2
您可以只告诉find
排除以 开头的文件pure_
,也可以grep
使用-regex
表达式执行:
find ./path -mindepth 1 -maxdepth 2 -type f ! -name 'pure_*' -regex '.*\.[0-9][0-9][0-9].txt$'
通过示例中模拟目录中的副本,我得到:
./path/1/file1.001.txt
./path/1/file2.001.txt
./path/2/file3.002.txt
答案3
find -type f | egrep "[0-9]{3}\.txt$" | grep -v pure_
查找find
从当前目录开始的文件。
应用egrep
扩展正则表达式,过滤行尾附加的三位数字“.txt”(点需要转义,否则“Atxt”也会匹配)。
过滤grep
掉-v
带有字符串“pure_”的 ( ) 行(我不确定“pure_”的位置是否重要)。