Encontre diretórios excluindo o colchete final ')'

Encontre diretórios excluindo o colchete final ')'

Estou tentando listar todos os diretórios de vídeo (não arquivos) que não terminam em um ano, por exemplo, (2015)e mais especificamente que não têm um ano listado, portanto, não terminam em colchetes de fechamento ).

Como posso fazer o oposto do seguinte:

# List all files and directories end with '(2015)'
ls -ld *\(2015\)

# List all files and directories end with ')'
ls -ld *\)

Alguém pode ajudar a explicar como fazer isso?

Responder1

Experimente isto:

ls -ld *[^\)]

[] - conjunto de caracteres nos quais estamos interessados

^ - negação (então incluímos um conjunto de caracteres que não queremos)

\) - escapou de ')'

Responder2

No bash ou zsh:

for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done

Isso simplesmente percorrerá todos os arquivos e diretórios no diretório atual e verificará se i) eles são um diretório ( [ -d "$i" ])e ii) seu nome não termina com )( [[ ! "$i" =~ \)$ ]]. os itens que passarem em ambos os testes serão impressos.

Isso pode lidar com nomes de arquivos arbitrários (que lsnão pode).

Responder3

Método 1a:

ls -ld -- *[^\)]

(usando o […]padrão de expansão do nome do caminho (curinga/glob): [abc]corresponde a a, b, ou c; [^abc]corresponde a qualquer coisa, exceto a, bou c; portanto, [^\)]corresponde a qualquer coisa, exceto ).)

Método 2a:

GLOBIGNORE="*)"
ls -ld -- *

Bastante autoexplicativo?

Ambos os métodos corresponderão a arquivos e outros objetos que não são diretórios.


Atualizado com sugestão de don_crissti, para encontrar apenas diretórios:

Método 1b:

ls -ld -- *[^\)]/

Método 2b:

GLOBIGNORE="*)/"
ls -ld -- */

Observe que você deve incluir o /no GLOBIGNOREvalor.

Responder4

POSIXamente:

find . ! -name . -prune -type d ! -name '*)'

Com zsh:

print -rl -- *[^\)](/)

Outros shells do tipo Bourne não têm capacidade de filtrar resultados globbing. Você pode usar:

printf '%s\n' *[!\)]/

para corresponder apenas aos diretórios. Mas isso adicionará uma barra final ao resultado da expansão. Com o diretório foo, você obterá foo/.

informação relacionada