所以,我正在尝试编写一个shell脚本,它找到当前目录中与固定正则表达式模式(在基本正则表达式中)匹配的所有文件,作为我脚本的参数。
我想出的是:
find ./ -maxdepth 1 -type f -regex "\.\/"$1""
我在开头有那些./因为find命令找到我的文件并以./files格式打印它们。
如果我给脚本一个参数a。*但是如果我尝试给它类似[0-9] \ {2 \} [a-zA-Z] *来找到我所有的文件,该命令有效两位数,后跟字母,没有任何反应,我发现它与逃避特殊字符有关但我似乎无法理解为什么以及如何正确地做到这一点......
答案 0 :(得分:1)
我猜这是因为您的文件名不是以数字开头。
尝试跑步:
find ./ -depth 1
看看你得到的路径。特别是在find
联机帮助页中,请注意:
这是整个路径上的匹配,而不是搜索
所以你应该假设隐含的^
和$
锚点。
您可能需要以下内容:
find ./ -depth 1 -regex "\./[0-9][0-9][A-Za-z]*"
我没有以{}
作为量词获得任何快乐,所以选择了更简单的答案。这可能归结为find
的不同版本。
或者我可能会建议让perl出局,特别是因为你只是经历了一个级别:
perl -e 'print join "\n", grep {m/^\d{2}/} glob ( "*" ) '
这使用了微妙的不同perl grep,它只对文件名(从*
扩展)匹配。
或者您可以添加路径:
perl -e 'print join "\n", grep {m,/\d{2},} glob ( "./*" )'
答案 1 :(得分:1)
你应该引用你传递的参数,否则它可能会在传递之前由shell进行全局扩展。此外,您将失去\
,因为shell会将\{
之类的内容扩展为{
。
您还应该引用您的论据$1
,如下所示:
find_regex() {
find ./ -maxdepth 1 -type f -regex "\./$1"
}
# usage: find_regex '[0-9]\{2\}[a-zA-Z]*'
这匹配文字.
,后跟/
,后跟传递给函数的参数。你在问题中的方式意味着$1
不在双引号之内,所以你会受到全局扩展和第二次丢失斜线的影响。