Como faço para que o comando find imprima o tamanho do arquivo com o nome do arquivo?
-
09-06-2019 - |
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
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
- o que está antes do texto 'equipe'
- o tamanho do arquivo
- 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 $
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 {} \;