it-swarm-pt.tech

Como obtenho o comando find para imprimir o tamanho do arquivo com o nome do arquivo?

Se eu emitir o comando find da seguinte forma:

$ find . -name *.ear

Ela imprime:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

O que eu quero 'imprimir' na linha de comando é o nome e o tamanho:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB
84
Brian
find . -name '*.ear' -exec ls -lh {} \;

apenas o h extra da resposta do jer.drab.org. economiza tempo convertendo para MB mentalmente;)

90
shyam

Você precisa usar -exec ou -printf. Printf funciona assim:

find . -name *.ear -printf "%p %k KB\n"

-exec é mais poderoso e permite que você execute comandos arbitrários - assim você pode usar uma versão de 'ls' ou 'wc' para imprimir o nome do arquivo juntamente com outras informações. 'man find' mostrará os argumentos disponíveis para o printf, o que pode fazer muito mais do que apenas o tamanho do arquivo.

[edit] -printf não está no padrão oficial do POSIX, portanto, verifique se ele é suportado na sua versão. No entanto, a maioria dos sistemas modernos usará o GNU find ou uma versão estendida da mesma forma, portanto, há uma boa chance de que ele seja implementado.

92
Leigh Caldwell

uma solução simples é usar a opção -ls em find:

find . -name \*.ear -ls

Isso dá a você cada entrada no formato normal "ls -l". Ou, para obter a saída específica que você procura, faça o seguinte:

find . -name \*.ear -printf "%p\t%k KB\n"

O que fornecerá o nome do arquivo seguido pelo tamanho em KB.

21
Michael Cramer

Usando o gnu find, acho que é isso que você deseja. Ele encontra todos os arquivos reais e não os diretórios (-type f), e para cada um imprime o nome do arquivo (% p), uma tabulação (\ t), o tamanho em kilobytes (% k), o sufixo "KB" e uma nova linha (\ n).

find . -type f -printf '%p\t%k KB\n'

Se o comando printf não formatar as coisas da maneira que desejar, você poderá usar exec, seguido pelo comando que deseja executar em cada arquivo. Use {} para o nome do arquivo e termine o comando com um ponto-e-vírgula (;). Na maioria dos shells, os três caracteres devem ser escapados com uma barra invertida.

Aqui está uma solução simples que os localiza e imprime usando "ls -lh", que mostrará o tamanho em formato legível (k para kilobytes, M para megabytes):

find . -type f -exec ls -lh \{\} \;

Como outra alternativa, "wc -c" imprimirá o número de caracteres (bytes) no arquivo:

find . -type f -exec wc -c \{\} \;
19
dmazzoni
find . -name '*.ear' -exec du -h {} \;

Isso fornece apenas o tamanho do arquivo, em vez de todo o material desnecessário.

7
user2121791

Por que não usar du -a? Por exemplo.

find . -name "*.ear" -exec du -a {} \;

Funciona em um Mac

4
Andreas

O Awk pode corrigir a saída para fornecer exatamente o que o solicitante solicitou. No meu sistema Solaris 10, find -ls imprime o tamanho em KB como o segundo campo, portanto:

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

Caso contrário, use -exec ls -lh e escolha o campo de tamanho da saída. Novamente no Solaris 10:

% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear
4
tpgould

Eu lutei com isso no Mac OS X, onde o comando find não suporta -printf.

Uma solução que eu encontrei, que confia no 'grupo' para todos os arquivos que são 'funcionários' foi ...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

Isso divide a saída longa ls em três tokens

  1. as coisas antes do texto 'pessoal'
  2. o tamanho do arquivo
  3. o nome do arquivo

E então gera os tokens 2 e 3, ou seja, a saída é o número de bytes e o nome do arquivo

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
3
Mike M

Isso deve fornecer o que você procura, incluindo a formatação (ou seja, nome do arquivo primeiro e tamanho depois):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

saída de amostra (onde usei -iname "*.php" para obter algum resultado):

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K
2
adriano72
 $ find. -name "test *" -exec du -sh {} \; 
 4,0K ./test1[.____.uffy0 ./test2[.____.✨0 ./test3[.____.✨0. /test4[.____.} $$$$.____.]

referência do Scripter World

1
scripter

Você poderia tentar isso:

find. -name *.ear -exec du {} \;

Isso lhe dará o tamanho em bytes. Mas o comando du também aceita os parâmetros -k para KB e -m para MB. Ele vai te dar uma saída como

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
1
Yaba
find . -name "*.ear" | xargs ls -sh
1
killdash10

Tente os seguintes comandos:

GNU stat:

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

BSD stat:

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

no entanto, stat não é padrão, então du ou wc poderia ser uma abordagem melhor:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers