查找具有基本名称匹配模式的文件,同时返回完整路径

查找具有基本名称匹配模式的文件,同时返回完整路径

我需要将结果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.txtwherexxx是 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_”的位置是否重要)。

相关内容