Usando ls para localizar arquivos que terminam em um caractere, ignorando a extensão

1

Eu devo usar o comando ls para encontrar arquivos que terminem em uma determinada letra, mas não importa se o arquivo tem uma extensão ou não.

Por exemplo, eu quero fazer isso

> ls test test.txt test.ascii other.txt

> ls [something] test test.txt test.ascii

Para que eu possa encontrar arquivos que terminem com um 't', mas não inclui o arquivo em que a extensão termina em t

Editar: Eu devo assumir que os únicos caracteres de período no nome do arquivo serão para a extensão e não haverá outros

    
por Anthony Rulli 11.09.2018 / 03:28

3 respostas

1

alguma coisa =

 |grep -e ".*t\.[^.]*" -e "^[^.]*t$"
    
por 11.09.2018 / 04:13
0

Se você estiver usando o bash shell, poderá usar a opção extglob para fazer um filtro complexo. Por exemplo:

Solução:

bash$ shopt -s extglob

bash$ ls
other.txt  test  test.ascii  test.txt

bash$ ls *@(t.*|[^.]?[[:alnum:]]t)
test  test.ascii  test.txt

Explicação:

PATTERN1 (t.*) corresponde a qualquer arquivo terminado com um "t" seguido por uma extensão de arquivo:

bash$ ls *@(t.*)
test.ascii  test.txt

PATTERN2 ([^.]?[[:alnum:]]t) corresponde a qualquer arquivo que NÃO tenha um ponto, seguido por zero ou mais caracteres alfanuméricos e termina com um "t". Isso corresponde a arquivos que não possuem uma extensão de arquivo:

bash$ ls *@([^.]?[[:alnum:]]t)
test

O glob @(PATTERN1|PATTERN2) corresponde a um dos padrões exatamente uma vez. O padrão combinado filtra apenas o que estamos procurando.

Para mais informações sobre os padrões do bash, consulte: link

    
por 11.09.2018 / 06:14
0

Supondo que você precisa de arquivos com apenas um ponto (extensão) e um Assumindo que você precisa procurar no diretório atual (./), você pode usar:

$ find . -maxdepth 1 -type f -regex './[^.]*t\(\.[^.]*\)?'
./test.txt
./test.ascii
./test

Isso pode ser usado, mas incluirá diretórios (e falhará se nomes de arquivos tiverem novas linhas):

$ printf '%s\n' * | grep -e ".*t\.[^.]*" -e "^[^.]*t$"
test
test.ascii
test.txt
tt

Para permitir nomes de arquivos com novas linhas, use (GNU grep):

$ printf '%s
$ find . -maxdepth 1 -type f -regex './[^.]*t\(\.[^.]*\)?'
./test.txt
./test.ascii
./test
' * | grep -ze ".*t\.[^.]*" -e "^[^.]*t$" | xargs -0 test test.ascii test.txt tt
    
por 11.09.2018 / 13:48