J'ai fait un script qui enveloppe la commande du avec ruby.
Créez le nom ʻexpand.rb`, collez le script ci-dessous et exécutez-le comme suit.
# ruby expand.rb (Le chemin que vous voulez trouver)
$ ruby expand_du.rb /var/lib/
7GB /var/lib/
3GB /var/lib/jenkins
2GB /var/lib/docker
1GB /var/lib/mysql
...
4KB /var/lib/mysql-files
du_-k_--max-depth_1_var_lib__20200516231438.Enregistré dans le journal
Scripts (github)
#Comment utiliser
# ruby expand_du.chemin rb
#Exemple: ruby expand_du.rb ~
#
#effet
# -Exécutez la commande du pour le chemin
# -Décharge le résultat de l'exécution sur la sortie et le fichier standard
#
#argument
# -chemin:Chemin cible pour exécuter la commande du
require 'rbconfig'
def main(target_path)
return puts "ArgumentError:Veuillez mettre le chemin dans l'argument" if target_path.nil?
max_depth_option_str = if os == :macosx
"-d"
else
"--max-depth"
end
exec_command = "du -k #{max_depth_option_str} 1 #{target_path}"
du_result_str = `#{exec_command}`
return if du_result_str.empty?
output_disksizes(du_result_str, exec_command)
end
def output_disksizes(du_result_str, exec_command)
disk_usages = du_result_str
.split("\n")
.map{|du_result| DiskUsage.new(du_result)}
.sort{|x, y| x.size <=> y.size}.reverse
output_filename = "#{exec_command.gsub(/( |\/){1,}/, "_")}_#{Time.new.strftime("%Y%m%d%H%M%S")}.log"
output_file = File.open(output_filename, "w")
disk_usages.each do |disk_usage|
puts disk_usage.to_s
output_file.puts(disk_usage.to_s)
end
output_file.close
puts "#{output_filename}Enregistré dans"
end
class DiskUsage
attr_reader :size, :path
def initialize(du_result_line)
du_result_params = du_result_line.split(" ").map(&:strip)
@size = du_result_params[0].to_i
@humanreadable_size, @humanreadable_unit = calc_humanreadable_size
@path = du_result_params[1]
end
def to_s
#REMARQUE Spécifiez 5 chiffres pour le moment. Augmenter si nécessaire
"#{sprintf("%5d" % @humanreadable_size)}#{@humanreadable_unit} #{@path}"
end
def humanreadable_size_with_unit
"#{@humanreadable_size}#{@humanreadable_unit}"
end
private
def calc_humanreadable_size
return [@size, "KB"] if mb_size < 1
return [mb_size, "MB"] if gb_size < 1
return [gb_size, "GB"] if tb_size < 1
[tb_size, "TB"]
end
def kb_size
@size
end
def mb_size
kb_size.fdiv(1024).round(1)
end
def gb_size
mb_size.fdiv(1024).round(1)
end
def tb_size
gb_size.fdiv(1024).round(1)
end
end
def os
case RbConfig::CONFIG['host_os']
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
:windows
when /darwin|mac os/
:macosx
when /linux/
:linux
when /solaris|bsd/
:unix
else
:unknown
end
end
Lorsque le serveur de location ou le Mac est plein, vous voulez savoir quel dossier en est la cause.
Par conséquent, si vous utilisez un Mac, vous pouvez voir l'état d'utilisation du stockage, et même si vous utilisez un serveur de location, vous pouvez voir combien vous en utilisez avec la commande df. Cependant, je ne peux que comprendre l'ensemble et ne pas savoir quel dossier en est la cause.
Par conséquent, la commande du peut être utilisée par ceux qui peuvent utiliser le terminal (la commande ls est également candidate, mais la commande ls connaît la taille du fichier directement sous elle, mais ne sait pas quelle est la taille du dossier).
Cependant, cette commande du est un peu insatisfaisante, probablement parce que c'est une commande UNIX.
Pour faciliter la lecture, j'utilise la commande sort avec l'option -h pour obtenir les tailles dans l'ordre décroissant, mais alors 5 Ko dépasse 4 Go. Je ne peux pas aider parce que je ne regarde que les chiffres.
Si vous utilisez du, il sortira le résultat sur la sortie standard, mais après l'avoir sorti, vous voudrez enregistrer le résultat après tout. Vous pouvez sortir le fichier depuis le début, mais il est difficile de sortir le fichier, puis cat. Si vous concevez une commande, elle sera sortie à la fois vers le fichier et la sortie standard, mais lorsque vous avez besoin de la commande du, vous êtes généralement pressé, donc je voulais le faire facilement.
Le script qui a résolu le problème ci-dessus est le premier script publié.
Les caractéristiques sont les suivantes.
――Il trie après avoir considéré l'unité --Il produit à la fois la sortie standard et le fichier (et les sorties avec un nom de fichier qui montre quel dossier a été recherché)
Je l'ai fait complètement pour moi, mais si quelqu'un a des problèmes avec la même chose, veuillez l'utiliser.
Recommended Posts