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.