Contar o número de caracteres por nome de arquivo listado

4

Dado o seguinte resultado ls:

$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

Isso fornecerá o número total de caracteres para todos os arquivos:

$ ls | wc -m
67

Mas como posso calcular o número de caracteres por nome de arquivo? Para a mesma lista de arquivos, o resultado que estou procurando seria algo assim:

8
10
10
6
etc...
    
por Fabricio 14.01.2014 / 01:45

3 respostas

4

Isso pode ser feito em um shell script muito simples:

for file in *; do echo -n "$file" | wc -m; done

Basta percorrer cada arquivo fazendo eco do nome para wc . O -n no echo é para que ele não acrescente uma nova linha, o que aumentaria erroneamente a contagem em 1.

    
por 14.01.2014 / 01:55
5

Você não precisa chamar wc , o bash é perfeitamente capaz: ${#var} é o tamanho do valor de $ var.

for f in *; do echo ${#f}; done

referência

    
por 14.01.2014 / 02:53
1

Embora @ resposta do Patrick esteja perfeitamente bem se você tiver que fazer uma tarefa semelhante sobre o valor de uma árvore de diretórios arquivos, você precisará mudar um pouco suas táticas. Um método para lidar com isso é usar find & while .

encontrar & enquanto

$ depth=2
$ find . -maxdepth $depth -type f -print0 | sed 's|\./||g' | \
    while IFS= read -r -d '' file; do \
      f=$(basename "$file"); printf "%s: %s\n" "$file" "${#f}"; \
    done | column -s : -t
dir2/more files3.txt        15
some long spacey file.txt   25
dir1/more files1.txt        15
dir1/more files2.txt        15
file 1.txt                  10
file 2.txt                  10

O acima irá gerar uma lista de arquivos separados por $depth (ou seja, NULLs). Você pode usar a variável find para controlar a profundidade da aparência do .\ . Essa lista é então depurada para que todos os caracteres sed sejam removidos por meio de printf .

Por fim, percorremos essa lista e usamos um ${#var} para imprimir o nome de cada arquivo junto com seu comprimento, usando o recurso interno do Bash para contar o comprimento de uma string, printf . O column -s : -t imprimirá o arquivo + seu caminho, mas apenas o tamanho do arquivo.

O : é apenas para imprimi-lo. Isso é feito dividindo a saída nos dois pontos, %code% e, em seguida, dividindo a saída em colunas eqüidistantes.

    
por 14.01.2014 / 03:02

Tags