ls com glob não funcionando em um script bash

7

Eu preciso listar todos os subdiretórios de um diretório, excluindo aqueles que correspondem a qualquer lista fornecida como argumento: "SUBDIR1, SUBDIR2, ..., SUBDIRN".

Eu vim com a solução (de muitas fontes) de usar ls com um padrão glob. Para testar o conceito, tentei na linha de comando a seguinte sequência que parece funcionar:

DIR="/path/to/dirs"
EXCLUDELIST="subdir1,subdir2"
#transform in a glob pattern for excluding given subdirectories
EXCLUDE="!(${EXCLUDELIST//,/|})"
LIST=$(cd $DIR && ls -l -d $EXCLUDE | grep -E "(^d)" | awk '{print $9}')

No entanto, quando eu coloco em um script bash inalterado , recebo este erro

ls: cannot access !(subdir1|subdir2): No such file or directory

O que estou fazendo errado ao colocar este código no script?

    
por pablochacin 10.02.2014 / 20:27

2 respostas

1

Dennis lhe contou por que seu roteiro está falhando, mas eu gostaria de sugerir uma maneira mais fácil (e segura) de fazer isso. Parsing ls é quase sempre uma má idéia , ele pode facilmente quebrar nomes de arquivos com espaços ou novas linhas ou outros caracteres estranhos e não é portátil nas configurações LOCALE. Além disso, seu comando é muito complexo, envolvendo várias etapas. Por que não fazer tudo em find ?

DIR="/path/to/dirs"
EXCLUDELIST="subdir1,subdir2"
## Build the regular expression
EXCLUDE="${EXCLUDELIST//,/|.*}"
LIST=$(find "$DIR" -type d -regextype posix-awk -not -regex ".*$EXCLUDE.*")

A propósito, o seu script irá falhar à medida que você o escreve, porque você constrói o glob antes cd -ing em $DIR , então ele será construído em relação ao conteúdo do seu diretório atual.

    
por 10.02.2014 / 22:12
6

Os shells de bash interativos e não interativos não se comportam da mesma forma. Uma das muitas diferenças é que a opção shell extglob é ativada por padrão para shells interativos (pelo menos na minha versão do bash), mas não para os não-interativos.

Para corrigir seu script, ative extglob com o seguinte comando:

shopt -s extglob
    
por 10.02.2014 / 20:52