使用 find 返回的文件与指定的模式不匹配

问题描述 投票:0回答:1

我的目的是显示目录和文件(仅在树结构中具有 .dat 或 .DAT 文件扩展名。我的 bash 脚本中的以下代码示例不仅返回这些目录和文件,而且还返回具有 .txt / .xmlfd 扩展名的文件.谁能指出我的代码有什么问题吗?

sudo -${user} sh -c 'cd '${userdirectory}'; find . -type f | grep -i '*.dat' | sort -u | xargs tree -L 3 -C'
sudo -${user} sh -c 'cd '${userdirectory}'; find . -type f -iname '*.dat' -exec dirname {} \; | sort -u | xargs tree -L 3 -C'
sudo -${user} sh -c 'cd '${userdirectory}'; find . -type f -name '*.[dD][aA][tT]' -exec dirname {} \; | sort -u | xargs tree -L 3 -C'
bash shell unix grep
1个回答
0
投票

您的 grep 正则表达式没有多大意义:正则表达式开头的星号具有字面星号的含义,并且仅当

find
生成的文件名之一包含星号时才匹配。句点与任何字符匹配,因此您的
grep
基本上会在文件名中搜索子字符串,例如
*xdat
*%dat
。如果您搜索名称以
.dat
结尾的文件,请 grep 查找
[.]dat$
:

grep -i '[.]dat$'

[.] matches a literal dot, and the 
$` 将匹配锚定在行尾。

当然,这一切都要求您的文件名不包含换行符。

© www.soinside.com 2019 - 2024. All rights reserved.