![Encontre diretórios excluindo o colchete final ')'](https://rvso.com/image/83705/Encontre%20diret%C3%B3rios%20excluindo%20o%20colchete%20final%20')'.png)
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 ls
nã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
, b
ou 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 GLOBIGNORE
valor.
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/
.