regex no shell '/ bin / sh'

0

Gostaria de remover todos os arquivos que terminam com um determinado conjunto de extensões em um diretório específico em um shell /bin/sh . Com um /bin/bash eu posso fazer isso com regex assim:

rm path/(*.pdf|*.png)

mas isso não parece funcionar com sh simples. Isso é normal ? Existe algum tipo de regex support ?

    
por PinkFloyd 18.08.2015 / 10:45

3 respostas

1

Não, isso não funcionará em um shell estritamente compatível com POSIX. Aqui está a referência normativa:

link

Como você pode ver, definitivamente não há regex, nem mesmo a notação de {a, b}.

    
por 18.08.2015 / 10:47
1

Como afirmado na resposta do user3188445 , isso não é compatível com POSIX.

No entanto, se você quiser fazer isso de qualquer maneira, é necessário usar outra ferramenta como find :

find dir/ -maxdepth 1 -type f -regex ".*.pdf\|.*.png" -delete

find pesquisa o diretório dir/ , não recursivamente ( -maxdepth 1 ), somente o arquivo é encontrado ( -type f ). A expressão regular corresponde aos arquivos .pdf e .png e -delete remove os arquivos encontrados.

    
por 18.08.2015 / 11:45
1

Para verificar qual shell você está realmente usando com / bin / sh, ligue:

/bin/sh whatshell.sh

e busque o script whatshell desta página:

link

ligue, e. wget http://www.in-ulm.de/~mascheck/various/whatshell/whatshell.sh

Saída típica:

$ sh whatshell.sh
SVR4 Bourne shell (SunOS 5 variant)

$ bosh whatshell.sh
SVR4 Bourne shell (SunOS 5 schily variant)

$ bash whatshell.sh
bash 3.2.25(1)-release

$ ksh whatshell.sh 
ksh88 Version (..-)11/16/88i

$ ksh93 whatshell.sh
ksh93 Version M 1993-12-28 s+

O POSIX não requer um shell POSIX em / bin / sh. Se você gosta de executar uma chamada de shell POSIX:

PATH='getconf PATH' export PATH
sh

observe que, se isso resultar na execução do bash, não é esperado que o shell seja compatível com POSIX.

    
por 19.08.2015 / 13:04