Nesse caso, o GNU find
permite 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'
( find
não é uma boa maneira de modificar arbitrariamente a saída de outros comandos, é claro!)
Algumas notas:
-maxdepth 1
e -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 -regex
vez de ambos (por exemplo, -regex "[^.]. MYPATTERN. "
-printf
suporta 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, bash
possui compgen
, dentre outras coisas, a expansão de globs, equivalente a uma ls
opçã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?