diff --git a/.classpath b/.classpath new file mode 100755 index 0000000..541d5b4 --- /dev/null +++ b/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/.project b/.project new file mode 100755 index 0000000..bd10b60 --- /dev/null +++ b/.project @@ -0,0 +1,18 @@ + + + TreeSize + + + + + + org.scala-ide.sdt.core.scalabuilder + + + + + + org.scala-ide.sdt.core.scalanature + org.eclipse.jdt.core.javanature + + diff --git a/src/dev/rsems/treesize/j/Directory.java b/src/dev/rsems/treesize/j/Directory.java new file mode 100755 index 0000000..0da3f82 --- /dev/null +++ b/src/dev/rsems/treesize/j/Directory.java @@ -0,0 +1,55 @@ +package dev.rsems.treesize.j; + +import java.io.File; +import java.io.FileFilter; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Directory { + Directory parent; + File fsdir; + Long localSize; + Long totalSize; + List children; + + public Directory(Directory parent, File fsdir) { + this.parent = parent; + this.fsdir = fsdir; + File[] files = fsdir.listFiles(new FileFilter() { + @Override + public boolean accept(File f) { + return f.isFile() && !Files.isSymbolicLink(f.toPath()); + } + }); + localSize = 0L; + if (files != null) { + for (int i = 0; i < files.length; i++) { + localSize += files[i].length(); + } + } + File[] fsdirs = fsdir.listFiles(new FileFilter() { + @Override + public boolean accept(File f) { + return f.isDirectory() && !Files.isSymbolicLink(f.toPath()); + } + }); + children = new ArrayList<>(); + totalSize = localSize; + if (fsdirs != null) { + for (int i = 0; i < fsdirs.length; i++) { + Directory subdirectory = new Directory(this, fsdirs[i]); + children.add(subdirectory); + totalSize += subdirectory.totalSize; + } + Collections.sort(children, new Comparator() { + @Override + public int compare(Directory d1, Directory d2) { + return -d1.totalSize.compareTo(d2.totalSize); + } + }); + } + } +} diff --git a/src/dev/rsems/treesize/j/Test.java b/src/dev/rsems/treesize/j/Test.java new file mode 100755 index 0000000..e22e7e3 --- /dev/null +++ b/src/dev/rsems/treesize/j/Test.java @@ -0,0 +1,49 @@ +package dev.rsems.treesize.j; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +public class Test { + + static void recurse(Directory d, int level) { + List subs = d.children; + for (int i = 0; i < subs.size(); i++) { + Directory child = subs.get(i); + Long ts = child.totalSize; + if (true) /* (ts >= 100000000L) */ { + StringBuilder sb = new StringBuilder(String.format("%,16d ", ts)); + String s = ""; + Directory temp = child; + int loop = 0; + while (temp.parent != null) { + /* ─ │ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼ */ + if (temp.parent.children.indexOf(temp) == temp.parent.children.size() - 1) { + if (loop == 0) { + s = " └── " + s; + } else { + s = " " + s; + } + } else if (loop == 0) { + s = " ├── " + s; + } else { + s = " │ " + s; + } + temp = temp.parent; + loop++; + } + sb.append(s).append(child.fsdir.getName()); + System.out.println(sb.toString()); + } + if (level <= 4) recurse(child, level + 1); + } + } + + public static void main(String[] args) throws IOException { + Directory d = new Directory(null, new File("/home/rob")); + String s = String.format("%,16d", d.totalSize) + " " + d.fsdir.getCanonicalPath(); + System.out.println(s); + recurse(d, 1); + } + +} diff --git a/src/dev/rsems/treesize/s/Directory.scala b/src/dev/rsems/treesize/s/Directory.scala new file mode 100755 index 0000000..6741af8 --- /dev/null +++ b/src/dev/rsems/treesize/s/Directory.scala @@ -0,0 +1,23 @@ +package dev.rsems.treesize.s + +import java.io.File +import java.nio.file.Files +import scala.collection.mutable.ListBuffer + +class Directory(val fsdir: File, val parent: Directory = null, val sort: Boolean = false) { + private var localSize = 0L + var children = ListBuffer[Directory]() + private val files = fsdir.listFiles + if (files != null) + localSize = files.filter(f => f.isFile() && !Files.isSymbolicLink(f.toPath)).map(f => f.length).sum + var totalSize = localSize + private val dirs = fsdir.listFiles + if (dirs != null) { + totalSize += dirs.filter(f => f.isDirectory() && !Files.isSymbolicLink(f.toPath)).map(dir => { + val subdir = new Directory(dir, this, sort) + children += subdir + subdir.totalSize + }).sum + if (sort) children = children.sortBy(-_.totalSize) + } +} \ No newline at end of file diff --git a/src/dev/rsems/treesize/s/Test.scala b/src/dev/rsems/treesize/s/Test.scala new file mode 100755 index 0000000..4dbf534 --- /dev/null +++ b/src/dev/rsems/treesize/s/Test.scala @@ -0,0 +1,48 @@ +package dev.rsems.treesize.s + +import java.io.File + +object Test extends App { + // ─ │ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼ + val LineUpAndRight = " \u2514\u2500\u2500 "; // " └── " + val LineBlank = " "; + val LineVerticalAndRight = " \u251c\u2500\u2500 "; // " ├── " + val LineVertical = " \u2502 "; // " │ " + + def recurse(d: Directory, level: Int) { + for (child <- d.children) { + val ts = child.totalSize + val sb = new StringBuilder("%,16d ".format(ts)) + var s = "" + var temp = child + var loop = 0 + while (temp.parent != null) { + if (temp.parent.children.indexOf(temp) == temp.parent.children.size - 1) { + if (loop == 0) { + s = "└─ " + s + } else { + s = " " + s + } + } else if (loop == 0) { + s = "├─ " + s + } else { + s = "│ " + s + } + temp = temp.parent + loop += 1 + } + sb.append(s).append(child.fsdir.getName) + println(sb.toString) + + // if (level <= 4) + + recurse(child, level + 1) + + } + } + + val dir = new Directory(new File("/home/rob")) + val s = "%,16d".format(dir.totalSize) + " " + dir.fsdir.getCanonicalPath + println(s) + recurse(dir, 1) +} \ No newline at end of file