Pergunta

Se eu emitir o comando find da seguinte maneira:

$ find . -name *.ear

Ele imprime:

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

O que 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
Foi útil?

Solução

find . -name '*.ear' -exec ls -lh {} \;

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

Outras dicas

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

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

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

[editar] -printf não está no padrão POSIX oficial, então verifique se é compatível com sua versão.No entanto, a maioria dos sistemas modernos usará o GNU find ou uma versão estendida semelhante, portanto há uma boa chance de que seja implementado.

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

find . -name \*.ear -ls

Isso fornece cada entrada no formato normal "ls -l".Ou, para obter o resultado específico que você parece estar procurando, isto:

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

O que lhe dará o nome do arquivo seguido do tamanho em KB.

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

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

Se o comando printf não formatar as coisas da maneira desejada, você pode usar exec, seguido do comando que deseja executar em cada arquivo.Use {} para o nome do arquivo e encerre o comando com ponto e vírgula (;).Na maioria dos shells, todos esses 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) do arquivo:

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

Isso fornece apenas o tamanho do arquivo, em vez de todas as coisas desnecessárias.

O Awk pode corrigir a saída para fornecer exatamente o que o questionador pediu.No meu sistema Solaris 10, encontre -ls imprime o tamanho em KB como o segundo campo, então:

% 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 selecione o campo de tamanho na 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

Por que não usar você -a ?Por exemplo.

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

Funciona em um Mac

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

Uma solução que encontrei, que reconhecidamente depende do 'grupo' para todos os arquivos serem 'equipe' foi ...

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

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

  1. o que está antes do texto 'equipe'
  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 depois o nome do arquivo

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

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

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.Isso lhe dará uma saída como

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
$ find . -name "test*" -exec du -sh {} \;
4.0K    ./test1
0       ./test2
0       ./test3
0       ./test4
$

Referência mundial do Scripter

Experimente 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 < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top