Se você deseja corresponder aos nomes de arquivos que começam com m
ou seguem um caractere de nova linha, isso seria:
NL='
'
find . \( -name 'm*' -o -name "*${NL}m*" \) -print
Observe que, pelo menos com GNU find
, *
não corresponderá a uma sequência de bytes que não formam uma sequência de caracteres válida. Você provavelmente seria melhor de usar a localidade C, se isso for um problema em potencial.
LC_ALL=C find . \( -name 'm*' -o -name "*${NL}m*" \) -print
Exemplo:
$ touch mom $'two\nminutes' $'mad\x80'
$ find . -name 'm*'
./mom
$ find . \( -name 'm*' -o -name "*${NL}m*" \) -print
./two?minutes
./mom
$ LC_ALL=C find . \( -name 'm*' -o -name "*${NL}m*" \) -print
./mad?
./two?minutes
./mom
Para nomes de arquivos que têm uma linha que começa com m
e não termina com g
:
LC_ALL=C find . \( -name 'm*' -o -name "*${NL}m*" \) ! \(
-name '*g' -o -name "*g${NL}*" \) -print
Algumas implementações de find
têm algumas opções fora do padrão para corresponder ao arquivo caminho (geralmente não nome ) usando expressões regulares, mas o comportamento varia entre implementação e são não é necessário aqui.
Em que você precisaria de expressões regulares, seria, por exemplo, encontrar arquivos cujo nome tem linhas que começam com m
e nenhuma delas termina em g
(como $'cat\nman\ndog'
, mas não $'plate\nmug\ncup'
nor $'cat\nman\nmug'
)
Com o GNU find
:
LC_ALL=C find . -regextype posix-extended -regex \
".*/(([^m$NL/][^/$NL]*|m[^/$NL]*[^$NL/g]|m|)($NL|\$))*"
Ou arquivos cujo nome tem pelo menos uma linha que começa com m
e não termina em g
(como $'mad\nmug'
mas não $'ming\nmong'
):
LC_ALL=C find . -regextype posix-extended -regex \
".*/([^/]*$NL)?m([^$NL/]*[^g$NL/])?(\$|${NL}[^/]*)"