我需要一种匹配目录中文件名的方法。
例如我有三个文件:
CAt_DoG_ZebRa.TXT
MOUSE_lion_deer_BIRD.TXT
fIsh_biRD_LION.TXT
我不是任何正则表达式专家,但我之前在SnapLogic和Pentaho中使用过类似的东西:
(?i).*(?=.*bird)(?=.*lion).*.TXT
以上内容将匹配包含“' bird'”字样的所有文件名。和狮子'如果忽略大小写,则单词的顺序无关紧要。很强大!所以它会匹配这两个:
MOUSE_lion_deer_BIRD.TXT
fIsh_biRD_LION.TXT
我尝试了上面的很多变种与find和grep一起无济于事。例如:
find . -regex ".*/(?i).*(?=.*bird)(?=.*lion).*.TXT"
以上查找与任何内容都不匹配。
有人可以推荐一种方法吗?
答案 0 :(得分:7)
shopt -s globstar # enable recursive globs
shopt -s nocaseglob # make globs case-insensitive
for file in ./**/*bird*lion*.txt; do
echo "found: $file"
done
......或者,如果你不关心这些词之间的顺序:
shopt -s globstar # enable recursive globs
shopt -s nocaseglob # make globs case-insensitive
shopt -s extglob # enable extended globbing syntax
for file in ./**/*@(bird*lion|lion*bird)*.txt; do
echo "found: $file"
done
答案 1 :(得分:2)
# ls
asdafsdfdBirdasfdfd.txt dasdbirdbfdgdlionb.txt fgdfLionqweBirdaqw.txt
# ls | /usr/gnu/bin/grep -i -E '.*(bird.*lion|lion.*bird).*\.txt'
dasdbirdbfdgdlionb.txt
fgdfLionqweBirdaqw.txt
一个技巧:当你使用向前看或者向后看写一些正则表达式时,怀疑它,并且要么改变另一种方式来编写它,要么考虑正则表达式是否适合解决这个问题。
答案 2 :(得分:1)