Quero saber o tamanho do arquivo com extensão .o (arquivo de objeto) na minha pasta Home.
Eu posso encontrar todos os arquivos de objetos usando
find . -name '*.o'
Como posso agora calcular o tamanho total desses arquivos?
fonte
Quero saber o tamanho do arquivo com extensão .o (arquivo de objeto) na minha pasta Home.
Eu posso encontrar todos os arquivos de objetos usando
find . -name '*.o'
Como posso agora calcular o tamanho total desses arquivos?
Você está procurando tubos ( |
). Eles são uma maneira de conectar vários comandos e transmitir a saída de um comando como entrada para outro. Nesse caso, você deseja passar todos os nomes de arquivos encontrados como entrada du
(que calcula o tamanho). No entanto, como du
espera que os nomes dos arquivos e os resultados find
sejam apenas uma lista de texto (sim, o texto consiste em nomes de arquivos, mas du
não é possível saber, tudo o que vê é texto), você precisa usar algo como o xargs
que linha de texto, trate-o como um nome de arquivo e passe-o para du
. Juntando tudo isso, obtemos:
find . -name "*.o" | xargs du -sch
você deve sempre citar os padrões que você atribui find
(como eu fiz acima "*.o"
:). Caso contrário, o shell expandirá *.o
para os nomes de todos os arquivos correspondentes no diretório atual. Funcionou neste caso apenas porque você não tinha arquivos correspondentes.
Os -sch
sinalizadores para du
estão documentados em man du
:
-c, --total
produce a grand total
-h, --human-readable
print sizes in human readable format (e.g., 1K 234M 2G)
-s, --summarize
display only a total for each argument
Observe, no entanto, que isso falhará nos nomes de arquivos que contêm espaço em branco. Isso quase certamente não será um problema para arquivos de objetos, mas no futuro, se você também precisar lidar com espaços, use:
find . -name "*.o" -print0 | xargs -0 du -sch
As -print0
marcas find
imprimem linhas separadas por NULL e as -0
marcas xargs
usam linhas como entrada.
Como alternativa, você pode find
imprimir os tamanhos em si e depois somar:
find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'
Isso também contorna o problema mencionado por @Serg nos comentários, onde há muitos argumentos e o comando é dividido em comandos separados.
Se você estiver usando bash
(provavelmente está), há uma maneira mais simples:
shopt globstar
du -sch **/*.o
O shopt globstar
comando faz **
corresponder todos os arquivos e ou mais subdiretórios. Depois de ativá-lo,**/*.o
corresponderá a todos os arquivos (e diretórios) cujo nome termina .o
, para que possamos passar isso diretamente para du
.
Observe que, diferentemente da find
abordagem, isso não corresponde aos arquivos ocultos (aqueles cujo nome começa com a .
). Para combinar com eles também, faça:
shopt -s dotglob globstar
du -sch **/*.o
du
e produzirá váriastotal
linhas. Aqui está o exemplo: paste.ubuntu.com/23092752Use o
-exec
sinalizador para executar odu
comando;
(significado por cada arquivo)Saída de amostra:
find
é recursivo - o que significa que ele percorre todos os subdiretórios. Se você quiser apenas obter o total de todos os*.o
arquivos no diretório atual, bastafonte
com perl:
Tamanho de todos os arquivos PDF não ocultos no diretório atual.
fonte
.o
arquivos e eles podem estar em subdiretórios. Você também pode adicionar um}{
antesprint $sum
para evitar a impressão da soma para cada iteração. Nós queremos apenas o último.