Nesse caso, o GNU findpermite que você faça todas essas coisas de uma só vez, eliminando pipes e a análise potencialmente problemática de ls:
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
( findnão é uma boa maneira de modificar arbitrariamente a saída de outros comandos, é claro!)
Algumas notas:
-maxdepth 1e -name [^.]*faça com que a correspondência de nomes funcione da mesma forma que uma planície ls(ou ls .). Você pode usar qualquer glob no estilo de shell, mas observe que "*" corresponderá a um "" inicial. em um nome † diferente de bash, [^.]*significa qualquer coisa que não tenha um "." inicial
- MYPATTERN é um POSIX ERE adequado (o tipo padrão é Emacs, veja aqui ), mas deve corresponder ao nome do arquivo inteiro, portanto, use algo como em
.*thing.*vez de apenasthing
- você provavelmente pode usar apenas um de
-name/ em -regexvez de ambos (por exemplo, -regex "[^.]. MYPATTERN. "
-printfsuporta muitas coisas , %né o nome do arquivo ou diretório sem adornos
† (isso pode depender da sua versão find, verifique a seção "CONFORMIDADE PADRÃO" da sua página de manual)
Como uma alternativa possível sem a necessidade de programas externos, bashpossui compgen, dentre outras coisas, a expansão de globs, equivalente a uma lsopção sem opções:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
Ele lida com nomes de arquivos com espaço em branco, incluindo novas linhas. compgen -G "*"deve fornecer a mesma saída que uma planície ls(mas observe que ls *é uma coisa completamente diferente). Você ainda precisará grep, e isso pode ou não resolver o problema, mas vale a pena mencionar.
ls- é ruim juju. Além disso, tem que sergrep? E você pode dar um exemplo de saída?