Quero verificar as pastas em /var/kafka
que todas elas terminam com número, caso contrário sairei com erro
ls -ltr /var/kafka
drwxr-xr-x 399 kafka kafka 28672 Nov 9 13:10 data6
drwxr-xr-x 392 kafka kafka 28672 Nov 9 13:10 data5
drwxr-xr-x 391 kafka kafka 28672 Nov 9 13:10 data1
drwxr-xr-x 405 kafka kafka 28672 Nov 9 13:10 data2
drwxr-xr-x 386 kafka kafka 28672 Nov 9 13:10 data4
drwxr-xr-x 389 kafka kafka 28672 Nov 9 13:10 data8
drwxr-xr-x 406 kafka kafka 28672 Nov 9 13:10 data7
drwxr-xr-x 397 kafka kafka 28672 Nov 9 13:10 data3
então eu crio o seguinte código simples (que deve estar no script bash)
for i in ` ls -ltr /var/kafka | awk '{print $NF}' `; do [[ ! $i = *?[0-9] ]] && echo "ERROR folder/s not ended with number" && exit 1 ; done
mas este exemplo acima é um código muito longo, e eu quero encontrar outro comando curto e elegante que simplesmente verifique se as pastas abaixo /var/kafka
terminam com um número ou não,
podemos usar awk/sed/
ou Perl
on line também.
Com
zsh
:O mesmo com
bash
:Para mostrar apenas o nome base /
t
ail desses arquivos (foo
em vez de/var/kafka/foo
), substitua$^files
por$^files:t
e"${files[@]}"
por"${files[@]##*/}"
.Observe que estritamente falando
*[^0-9]
(ou*[^0123456789]
em bash) corresponde a nomes de arquivos que terminam com um caractere diferente de um dígito, para nomes de arquivos que não terminam com um dígito, isso está^*[0-9]
em zsh (para o qual você precisaset -o extendedglob
ou!(*[0-9])
em bash (para o qual você needshopt -s extglob
), mas como o nome de um arquivo não pode estar vazio, isso deve ser equivalente.Se você não precisar listar esses arquivos na mensagem de erro, em zsh, isso pode ser abreviado para:
Where
Y1
para de olhar para a primeira correspondência e a lista de correspondências é passada para uma função anônima que retorna verdadeiro se for passado pelo menos um argumento ($#
não é zero).Caso precise considerar apenas os arquivos do tipo directory , ainda em zsh, adicione
/
ao qualificador glob:bash não possui qualificadores glob, mas você pode recorrer a
find
para relatar os arquivos do tipo diretório cujo nome não termina em dígitos:Com bash4.4 ou mais recente e
find
compatível com-print0
:Com versões mais antigas do bash, você sempre pode preencher o array em um loop:
Usamos
LC_ALL=C
apenas[0-9]
correspondências em 0123456789 e não nos milhares de outros caracteres que geralmente classificam entre 0 e 9 em outras localidades, e também para que as*
correspondências*[0-9]
em 0 ou mais caracteres correspondam a 0 ou mais bytes.Agora, tome cuidado, pois algumas localidades usam uma codificação de caracteres onde alguns caracteres adicionais, além de 0123456789, possuem uma codificação que termina no mesmo valor de byte que 0123456789. Por exemplo, no conjunto de caracteres GB18030 usado na China:
O
¾
caractere geralmente é correspondido[0-9]
independentemente de como é codificado, porque é classificado entre 0 e 9 por razões óbvias, mas também sua codificação GB18030 termina no byte 0x36, que também é a codificação do6
caractere de dígito ASCII.Portanto, na localidade C, o caminho do arquivo composto pela codificação GB18030
/var/kafka/¾¾¾
será considerado como terminando em um dígito ASCII e não será relatado. Se deveria ou não, é outra questão.Usando
find
:Estou "abusando"
grep
para obter um código de retorno sensato, se alguém souber de uma maneira melhor, por favor me avise.Outra variante:
Isso retorna verdadeiro (
$?
é 0) se todos os nomes de diretório terminarem com um dígito