[RUBY] Comme la commande du utilisée lorsque la capacité est pleine est difficile à utiliser, j'ai essayé de l'envelopper avec du rubis

Conclusion

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

Contexte

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.

Le tri n'est pas bon

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.

C'est un problème de frapper deux fois pour enregistrer

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.

Fonctionnalités de script

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

Comme la commande du utilisée lorsque la capacité est pleine est difficile à utiliser, j'ai essayé de l'envelopper avec du rubis
Quand j'ai essayé d'utiliser le kit AWS SDK avec Ruby + Lambda, `sam local` était en panne.
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
Lors de l'importation de CSV avec Rails, il était vraiment facile d'utiliser la commande nkf
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
[Ruby] C'est la solution. Quand dois-je utiliser des variables d'instance?
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
L'argument de link_to est nul (nul) et un lien inattendu a été généré, j'ai donc essayé de le vérifier
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
Un avertissement s'affiche lorsque vous essayez d'utiliser un entier énorme avec les variables spéciales $ 1, $ 2, $ 3 ...
J'ai essayé de réduire la capacité de Spring Boot
J'ai utilisé jnr-ffi (facilité d'utilisation, etc.)
Il est difficile d'utiliser la chaîne de caractères vide et la date de DBUnit, donc corrigez-la et utilisez-la.
J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)
Lorsque j'ai essayé de faire défiler automatiquement avec JScrollBar, le gestionnaire d'événements n'a été dessiné qu'une seule fois.
J'ai essayé de résoudre le problème de la boisson bonus Ruby (il y a un exemple de réponse)
Puisque la lecture de JdbcCodeList de TERASOLUNA est lente, j'ai essayé d'enregistrer plusieurs à la fois.
Lorsque j'ai essayé d'exécuter Azure Kinect DK avec Docker, il a été bloqué par le CLUF
Pourquoi puis-je utiliser la commande rails installée avec gem? ??
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
J'ai brièvement résumé la grammaire de base de Ruby
Je veux passer la commande de démarrage à postgres avec docker-compose.
J'ai essayé de résoudre le problème de création de carte de bingo Ruby (il y a un exemple de réponse)
Est-il facile à utiliser pour l'utilisateur lors de la mise en œuvre de fonctions à usage général? Soyons conscients de
Lorsque j'ai essayé d'exécuter mon propre service, il a échoué, alors je l'ai vissé dans le planificateur de tâches
Mémorandum: Quand j'ai essayé TensorFlow avec Tribuo, cela n'a pas fonctionné, alors je suis parti en voyage pour retrouver le chef de famille et je me suis perdu.
J'ai essayé DI avec Ruby
Commande Rbenv pour utiliser Ruby
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai eu un IllegalAccessError en essayant d'utiliser PowerMock avec JUnit
[Rubiy] J'ai essayé de résumer le traitement de la boucle ce soir [fois, pause ...]
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de réimplémenter Ruby's Float (arg, exception: true) avec builtin
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé de faire un Numeron qui n'est pas bon avec Ruby
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
J'ai essayé de comprendre le flux lors de l'analyse d'image avec Vision Framework et Core ML