A questão quer que eu liste todos os arquivos armazenados nos /usr/bin
quais os nomes dos arquivos contêm apenas letras minúsculas em inglês e contêm a palavra 'arquivo'.
Por exemplo, nsrfile
e file
deve estar na saída
Aqui está o meu código para conseguir isso
ls /usr/bin | grep '\<[a-z]*file[a-z]*\>'
e aqui está uma parte do resultado que obtenho.
file
nsrfile
grub2-file
systemd-tmpfiles
no entanto, a pergunta diz que o nome do arquivo deve conter apenas letras minúsculas em inglês, mas não a barra-
e grub2-file
ainda contém um número
como devo mudar meus comandos?
O que eu faria :
Explicação:
é um grep reverso. Existem dois padrões:
[0-9]
e-
Expectativa e alerta
Sua atribuição pode esperar que você obtenha
grep
a saída dels
, talvez algo assim:Onde você pede
ls
os nomes dos arquivos, entãogrep
filtre aqueles que começam (^
) e terminam ($
) apenas com letras minúsculas -- zero ou mais delas (*
); você então pedexargs
para grep cada nome de arquivo recebido para a string "arquivo".Isso gera problemas imediatos assim que qualquer nome de arquivo (improvável que esteja em /usr/bin) contenha uma nova linha. (Arquivos com espaços
Some File Name
serão excluídos pelo grep.) Para um exemplo artificial para mostrar o ponto:No exemplo acima,
ls
escrevi o seguinte conteúdo no pipe para grep:O Grep passou corretamente esses dois "nomes de arquivo" pelo canal para xargs, que então pensou que tinha dois nomes de arquivo para os quais grep, e então executou:
... que então reclamou dos arquivos perdidos.
Sugestão
Embora não seja esperado, sugiro a seguinte opção mais segura, assumindo um bash shell:
Isso ativa a funcionalidade globbing estendida do bash . Você então pede
grep
para listar os nomes de arquivos (-l
) que contêm a string "file" entre os arquivos em /usr/bin que não (!
) correspondem ao padrão: "anything (*
) seguido por qualquer ([ ... ]
) não (^
) -minúscula letra (a-z
), seguida de qualquer coisa (*
), ou seja, somente arquivos que contenham apenas letras minúsculas em seus nomes.Duas soluções:
Um loop de concha:
Isso primeiro gera uma lista de nomes de caminho
/usr/bin
cujo nome de base corresponde*file*
e, em seguida, testa se esses nomes de base também contêm caracteres que não são letras minúsculas. Se nenhuma letra não minúscula for encontrada, o nome do caminho será impresso.Isso potencialmente também encontraria nomes de diretórios que atendessem aos critérios. Se isso não for desejado, apenas faça
antes da
case
instrução para pular todos os nomes que não sejam um arquivo regular.Usando GNU
find
:Isso também faz uma filtragem de dois estágios. Primeiro no nome base que deve corresponder
*file*
e, em seguida, no final do nome do caminho (-regex
corresponde ao nome do caminho completo) para garantir que haja apenas letras minúsculas.Você estava perto do objetivo, apenas altere os limites "word-boundary" (\<>) para os limites de início e fim de linha (^$) e tudo ficará bem:
Ou seja: partindo do início de cada linha encontre linhas que contenham qualquer quantidade de letras minúsculas (az) zero ou mais vezes seguidas do arquivo de palavras e letras minúsculas novamente até o final da linha.
Observe que o comando acima não funcionará corretamente para nomes de arquivo com novas linhas.