ls para mostrar apenas o diretório / nome do arquivo e tamanho

5

Em primeiro lugar, isso não é uma duplicata disso: Linux mostra apenas a data e o tamanho do nome do arquivo

Porque eu quero imprimir o nome do diretório real adicionalmente.

Eu estava sempre usando este comando:

ls -l | awk '{print $5, $9}'

para obter o tamanho e o nome de cada arquivo. Mas agora, eu preciso imprimir o diretório de arquivos adicionalmente.

Isso é possível?

    
por Cyclone 24.02.2012 / 12:44

4 respostas

4

Você quer dizer assim, apenas prefixando o diretório atual para cada nome de arquivo?

ls -l | awk -v PWD=$PWD '{printf("%s %s/%s\n", $5, PWD, $9); }'

(o -v apenas importa a variável shell $PWD para o script awk).

Ou algo mais?

OK, aparentemente o que você quer é

$ cd /some/path/to/somewhere
$ <insert command here>
somewhere/file1 size1
somewhere/file2 size2
...

está correto ?

Se sim, a mudança que você precisa é esta:

ls -l | awk -v PWD=$(basename $PWD) '{printf("%s/%s %s\n", PWD, $9, $5); }'

Se você tem um shell mais antigo, o $() pode não funcionar e, nesse caso, tente:

ls -l | awk -v PWD='basename $PWD' '{printf("%s/%s %s\n", PWD, $9, $5); }'

em vez disso. Não tenho acesso imediato a nenhum shell que não ofereça suporte a $() , mas não consigo pensar de onde mais seu erro Illegal variable name poderia vir, quando isso funciona para mim.

Se ainda não funcionar, por favor descreva sua plataforma, shell, versão do awk etc. em sua pergunta - o tópico do comentário está ficando muito longo e estou ficando sem palpites: -)

    
por 24.02.2012 / 14:29
2

No espírito de "não analisar a saída ls", por que não usar find ?:

find . -maxdepth 1 -printf "%p\t%s\n"
    
por 09.11.2016 / 15:38
0

Se você deseja incluir a parte do diretório do nome do arquivo na saída ls , inclua-a na linha de comando.

ls -l "$PWD" | awk '{print $5, $9}'

Se você quiser imprimir um caminho relativo, organize-se para chamar ls do diretório correto para imprimir o caminho relativo desejado, por exemplo,

dir=$(dirname "$PWD")
cd .. && ls -l -- "$dir" | …

Esteja ciente das armadilhas da análise da saída de ls : se um nome de usuário ou um nome de grupo ou um o nome do arquivo contém espaços em branco, esse snippet gera um absurdo.

Uma maneira confiável, mas não portátil, de listar os atributos de arquivo em um formato personalizado é stat .

stat -f '%8z %R' -- *
stat -f '%8x %n' -- "$dir"/*

Uma maneira mais lenta, porém mais flexível, de produzir essa saída é fazer uma iteração nos arquivos dentro do shell.

for x in *; do
  printf '%8d %s\n' "$(wc -c <"$x")" "whatever/you/want/$x"
done
    
por 24.02.2012 / 20:00
0

Isso é emprestado do que Inútil sugeriu acima :

/bin/ls -l | awk -v CUR_DIR=$(basename $(pwd)) '{ if ($1 != "total") {printf("%s/%s %s\n", CUR_DIR, $8, $5);} }'

Isso, no entanto, filtra a linha "total xyz". Observe que a saída de ls pode diferir em distribuições diferentes. Mina mostra o nome do arquivo na 8ª coluna (enquanto Useless mostra como 9ª coluna). Exemplo de saída é mostrado abaixo:

ds/binary_search.py 1660
ds/growth.png 28262
ds/growth.py 1147
ds/heap.py 1277
ds/postfix.py 969
ds/prim.py 39
ds/queue.py 1188
ds/quicksort.py 2535
ds/QuickSortWeiss.class 2821
ds/QuickSortWeiss.java 3500
ds/sin-cos.py 401
ds/sin-cos-two.png 28509
ds/sorting.py 4997

Um último ponto: pode ser útil fornecer a localização exata de ls . Caso contrário, no caso de ls ser aliado para outra coisa, a saída poderá variar novamente.

Atualização:

O comando acima não parece funcionar em todos os sistemas, não sei por quê. No entanto, este deve funcionar, espero.

/bin/ls -l | awk  '{ if ($1 != "total") {printf("%s/%s %s\n", $(basename $(pwd)), $8, $5);} }' | awk '{ print $8, $9 }'
    
por 25.02.2012 / 18:50