É possível usar xargs
para executar mais de um comando? A única informação relacionada que encontrei foi esta pergunta , mas a resposta não estava relacionada xargs
.
estou executando um simples
du / -ah | sort -r -n | head -n 10 | awk '{print $2}'
para encontrar os arquivos que ocupam mais espaço em disco. No entanto, está retornando também diretórios, e quero excluir apenas arquivos para manter qualquer estrutura.
Estou cansado de usar find
o comando, porque não tenho certeza se posso pesquisar pelo uso do disco e não pelo tamanho do arquivo.
Qualquer entrada seria super apreciada!
Você pode usar
find
para obter apenas arquivos regulares e executádu
-los. O erro padrão é suprimido para o comando abaixo, porque se você fizer isso para o seu diretório raiz, pode haver algumas reclamações por alguns diretórios especiais. Aqui-h
é usado paradu
esort
, o que é bom para ordenar a exibição de tamanhos de arquivo.Além disso, a nova linha é usada como separador de arquivo para o comando acima. O caminho seguro para um shell GNU é usar o byte nulo para separar os argumentos como:
Para o seu caso (pesquisando
/
como qualquer usuário) basta imprimir os arquivos, juntamente com seu tamanho, e decidir o que fazer. Não envie o resultado diretamente pararm --
.Veja também:
Obtendo apenas com o tamanho dos arquivos
Encontre e exclua os maiores arquivos
diretórios são um dos muitos tipos de arquivos (regular, diretório, link simbólico, fifo, dispositivo...). Talvez você quis dizer arquivos regulares, pois esse é o outro tipo de arquivo ao lado de diretórios que possuem espaço em disco alocado para eles¹.
Está errado porque com
-h
, você obtém sufixos KMGT... o que significasort -n
que não funcionará. A implementação GNU desort
tem uma-h
opção para decodificar esses sufixos, mas devido ao arredondamento, a ordem ainda pode estar errada.Observe também que os links físicos são contados apenas uma vez e que os caminhos dos arquivos podem conter caracteres de nova linha e não serem feitos de texto. Sem mencionar que o
awk
retorno do segundo campo delimitado por espaço em branco engasgará nos caminhos de arquivo que contêm espaços em branco. 0 é o único valor de byte que não pode ocorrer em um caminho de arquivo, portanto, você deseja usar registros delimitados por NUL para representar listas de arquivos.-h
é uma extensão GNU. A implementação GNU defind
pode relatar o uso do disco com-printf %b
ou-printf %k
, então você pode fazer algo como:Observe que o
tr
é apenas para saída para consumo humano, se você quisesse pós-processar essa lista, você desejaria manter o formato delimitado por NUL. Por exemplo, para excluir os 10 maiores arquivos (em termos de uso de disco):(
-printf
,-z
,-r
,-0
são todas extensões GNU, emboraxargs -0
agora sejam suportadas por algumas outras implementações;-r
também em menor grau).Tecnicamente,
rm
desvincula os arquivos do diretório pai. Você pode descobrir que esse pipeline retorna o mesmo arquivo vinculado a 10 diretórios diferentes; você o desvincularia deles, mas se esse arquivo ainda estiver vinculado a mais alguns diretórios, você não recuperará seu espaço.Se você quisesse excluir todas as entradas (links) nos diretórios
.
dos 10 maiores arquivos, você poderia fazer:¹ tenha em atenção que para ficheiros do tipo directório ,
du
reporta a utilização do disco do próprio ficheiro de directório, mais o de qualquer ficheiro único que lista e os dos seus subdirectórios recursivamente.