[RUBY] Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln

Fazit

Ich habe ein Skript erstellt, das den Befehl du mit Ruby umschließt.

Erstellen Sie den Namen "expand.rb", fügen Sie das folgende Skript ein und führen Sie es wie folgt aus.

# ruby expand.rb (Der Pfad, den Sie finden möchten)
$ 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.Im Protokoll gespeichert

Skripte (github)

#Wie benutzt man
# ruby expand_du.rb Pfad
#Beispiel: Rubin expandieren_du.rb ~
#
#bewirken
# -Führen Sie den Befehl du für den Pfad aus
# -Entladen Sie das Ausführungsergebnis in die Standardausgabe und -datei
#
#Streit
# -Pfad:Zielpfad zum Ausführen des Befehls du

require 'rbconfig'

def main(target_path)
  return puts "ArgumentError:Bitte geben Sie den Pfad in das Argument ein" 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}Gespeichert in"
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
    #HINWEIS Geben Sie vorerst 5 Stellen an. Bei Bedarf erhöhen
    "#{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

Hintergrund

Wenn der Mietserver oder Mac voll ist, möchten Sie wissen, welcher Ordner die Ursache ist.

Wenn Sie also ein Mac sind, können Sie den Status der Speichernutzung anzeigen, und selbst wenn Sie ein Mietserver sind, können Sie sehen, wie viel Sie mit dem Befehl df verwenden. Ich kann jedoch nur das Ganze verstehen und weiß nicht, welcher Ordner die Ursache ist.

Daher kann der Befehl du von denjenigen verwendet werden, die das Terminal verwenden können (der Befehl ls ist ebenfalls ein Kandidat, aber der Befehl ls kennt die Größe der Datei direkt darunter, weiß jedoch nicht, wie groß der Ordner ist).

Dieser du-Befehl ist jedoch etwas unbefriedigend, wahrscheinlich weil es sich um einen UNIX-Befehl handelt.

Sortieren ist nicht gut

Um das Lesen zu vereinfachen, verwende ich den Befehl sort mit der Option -h, um die Größen in absteigender Reihenfolge abzurufen. Dann liegen 5 KB über 4 GB. Ich kann nicht helfen, weil ich nur die Zahlen betrachte.

Es ist mühsam, zweimal zu schlagen, um aufzunehmen

Wenn Sie du verwenden, wird das Ergebnis an die Standardausgabe ausgegeben, aber nachdem Sie es ausgegeben haben, möchten Sie das Ergebnis schließlich aufzeichnen. Sie können die Datei von Anfang an ausgeben, es ist jedoch mühsam, die Datei und dann cat auszugeben. Wenn Sie einen Befehl entwickeln, wird dieser sowohl in die Datei als auch in die Standardausgabe ausgegeben. Wenn Sie jedoch den Befehl du benötigen, haben Sie es normalerweise eilig, daher wollte ich es einfach machen.

Skriptfunktionen

Das Skript, das das obige Problem gelöst hat, ist das erste veröffentlichte Skript.

Die Funktionen sind wie folgt.

――Es wird nach Berücksichtigung des Geräts sortiert

Ich habe es komplett für mich selbst gemacht, aber wenn jemand Probleme mit der gleichen Sache hat, benutze es bitte.

Recommended Posts

Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln
Als ich versuchte, das AWS SDK mit Ruby + Lambda zu verwenden, war "sam local" durcheinander.
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Beim Importieren von CSV mit Rails war es wirklich einfach, den Befehl nkf zu verwenden
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
[Ruby] Dies ist die Lösung. Wann sollte ich Instanzvariablen verwenden?
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Das Argument von link_to ist nil (null) und ein unerwarteter Link wurde generiert, daher habe ich versucht, ihn zu überprüfen
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Eine Warnung wird angezeigt, wenn versucht wird, eine große Ganzzahl mit den speziellen Variablen $ 1, $ 2, $ 3 ... zu verwenden.
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe jnr-ffi verwendet (einfacher zu bedienen usw.)
Es ist schwierig, die leere Zeichenfolge und das Datum von DBUnit zu verwenden. Korrigieren Sie es also und verwenden Sie es.
Ich habe versucht, das Problem mit der Ruby-Karaoke-Maschine zu lösen (es gibt ein Beispiel für die Antwort).
Als ich versuchte, mit JScrollBar automatisch zu scrollen, wurde der Ereignishandler nur einmal gezeichnet.
Ich habe versucht, das Problem mit dem Ruby-Bonusgetränk zu lösen (es gibt ein Beispiel für die Antwort).
Da das Lesen von JdbcCodeList von TERASOLUNA langsam ist, habe ich versucht, mehrere gleichzeitig zu registrieren.
Als ich versuchte, Azure Kinect DK mit Docker auszuführen, wurde es von EULA blockiert
Warum kann ich den mit gem installierten Befehl Rails verwenden? ??
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich habe versucht, das Problem bei der Erstellung von Ruby-Bingokarten zu lösen (es gibt ein Beispiel für die Antwort).
Ist es für den Benutzer einfach, Allzweckfunktionen zu implementieren? Seien wir uns dessen bewusst
Als ich versuchte, meinen eigenen Dienst auszuführen, schlug dies fehl und ich schraubte ihn in den Taskplaner
Memorandum: Als ich TensorFlow mit Tribuo ausprobierte, funktionierte es nicht, also machte ich mich auf den Weg, um die Hauptfamilie zu finden, und verlor.
Ich habe DI mit Ruby versucht
Rbenv-Befehl zur Verwendung von Ruby
Auf Anforderung wird der Zugriff auf die Ressource beim Push mit Docker verweigert
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Beim Versuch, PowerMock mit JUnit zu verwenden, wurde ein IllegalAccessError angezeigt
[Rubiy] Heute Abend habe ich versucht, die Schleifenverarbeitung zusammenzufassen [Zeiten, Pause ...]
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht, Ruby's Float (arg, Ausnahme: true) mit Builtin neu zu implementieren
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, einen Numeron zu erstellen, der mit Ruby nicht gut ist
Ich möchte eine Datei mit Ruby im Internet herunterladen und lokal speichern (mit Vorsicht).
Ich habe versucht, den Ablauf bei der Bildanalyse mit Vision Framework und Core ML herauszufinden