Como seleciono arquivos em um script bash que não possui uma extensão?

6

Digamos que eu tenha arquivos xinitrc, alphabetsoup, ieat.pie no diretório atual. Precisa de um script bash para selecionar apenas xinitrc e alphabetsoup.

    
por pedram 21.08.2013 / 18:40

4 respostas

7

O bash extended glob +([^.]) irá combinar arquivos sem qualquer . em seu nome. Isso requer que você não tenha desfeito shopt extglob (nas instalações modernas do bash, deve ser configurado por padrão). O padrão significa:

any number (but at least one) of characters other than .

Você pode colocar todos os nomes de arquivos em uma matriz:

NO_EXTENSION=( +([^.]) )

Você pode imprimir os nomes dos arquivos:

printf "%s\n" +([^.])

Ou passe todos eles para um utilitário:

ls -- +([^.])

Se você quer que eles sejam variáveis, mas não um array, você precisa ter certeza de que nenhum arquivo tem espaço em branco em seu nome. Se você está absolutamente certo disso, você pode fazer:

NO_EXTENSION=$(echo +([^.]))

A invocação do eco é necessária para que a expansão do nome do caminho aconteça, ao contrário do caso da matriz. Eu recomendo strongmente o uso de matrizes para esse tipo de lista, porque você não precisa se preocupar com caracteres especiais nos nomes de arquivos.

    
por 21.08.2013 / 18:46
5

Você pode obter uma lista de arquivos sem ponto final em seus nomes no diretório de trabalho com:

find . -maxdepth 1 ! -name "*.*"

Você também pode ter arquivos que são .file em unix, se você quiser corresponder a eles e file , mas não file.ext , então você pode usar:

find . -maxdepth 1 ! -name "*.*" -o -name ".*[^.]*"
    
por 21.08.2013 / 20:13
3

Com a extglob opção , você pode combinar o complemento de um padrão, ou seja, os arquivos cujo nome não corresponde ao padrão. Os arquivos com extensões são os que correspondem a *.* , portanto, os arquivos sem extensão no diretório atual podem ser correspondidos dessa maneira:

shopt -s extglob
somecommand !(*.*)

Observe que os arquivos de ponto (arquivos cujo nome começa com . ) não serão incluídos. Se você quiser combiná-los também e tratá-los como sem extensão, a menos que eles contenham um segundo . , você pode usar

shopt -s extglob nullglob
somecommand !(*.*) .!(*.*)

ou

shopt -s dotglob extglob
somecommand !(?*.*)
    
por 23.08.2013 / 03:22
0

Talvez você esteja procurando por isso:

$ ls | grep -v '\.'

Exemplo:

$ ls
alphabetsoup  ieat.pie  xinitrc
$ ls | grep -v '\.'
alphabetsoup
xinitrc
    
por 21.08.2013 / 20:08