ACMM
(usa Ubuntu)
Enviado em 12/01/2020 - 19:38h
marimbondo2 escreveu:
Não sou especilista como muitos aqui mas nesse dois casos, você está pedindo pro Bash só pegar as últimas 31 letras dos nomes dos arquivos.
Se o arquivo/pasta tiver menos que 31 letras no nome, fica em branco.
d+=(${x:31})
arq+=(${x:31})
Para evitar quebrar o nome dentro de um array, use '""':
d+=("${x}")
arq+=("${x}")
Trabalhar com arrays no Z-shell é muito melhor.
Sei que tem casos especiais que se deve usar POSIX, mas para quê ignorar todas as funcionalidades novas do Bash?
In POSIX sh, += is undefined
Você pode listar o número de diretórios usando (se não forem diretórios que começam com '.', do contrário pode adicionar a opção -A):
$ ls -d -1 */ | wc -l
A opção '-d' é só para se certificar que o Ls vai listar diretórios e a opção '-1' é para listar em apenas uma coluna simples. A sua shell vai interpretar o coringa '*' para listar qualquer arquivo (pastas são meramente um arquivo com um índice de outros arquivos no UNIX), e somente as pastas tem a barra '/' no final do nome para a shell.
Para listar o número de arquivos:
$ ls -p -1 |grep -cv '/'
A opção '-p' do Ls adiciona a barra '/' no final do nome de pastas, assim o grep vai contar '-c' todas as linhas que _não_ contém uma barra, opção '-v'.
Valeu pela ajuda. Funcionou. Era tão simples e eu quebrando a cabeça...
Quanto a esse detalhe:
d+=(${x:31})
arq+=(${x:31})
Eu coloquei o valor fixo porque no
path que eu estava fazendo o teste antes, eu sabia que dava um total de 31 caracteres e resolvi fazer essa gambiarra básica só pra fazer o script funcionar.
É verdade o que disse: se tiver um diretório ou arquivo com menos de 31 caracteres, eu vou ter problemas. Eu já havia resolvido isso da seguinte forma:
drt=/media/SSD2/Python/*
rmv=$[ ${#drt} - 1 ]
E nas partes onde eu preciso "cortar" as strings, fiz assim:
d+=("${x:$rmv}")
arq+=("${x:$rmv}")
Agora está funcionando de boa.
Abraços.
Guns don't kill people. People kill people.