@alvaro
sign in · lmno.lol

Diffing directories content size

Needed to diff two directories, but only interested in file size changes. diff, find, sort, and stat seem to do the job:

diff <(find dir1 -type f -exec stat -f '%N %z' '{}' \; | sort) <(find dir2 -type f -exec stat -f '%N %z' '{}' \; | sort)
1,3c1,2
< dir1/one.txt 14
< dir1/subdir/file.txt 5
< dir1/three.txt 7
---
> dir2/one.txt 19
> dir2/two.txt 0

Note: Using diff, find, sort, and stat on macOS.

Update 1

I've since learned about mtree (thanks Roman!). A nice utility to add to the toolbox.

mtree -p emacs-25.1 -c -k size -d
#    user: me
# machine: my-machine
#    tree: /path/to/emacs-25.1
#    date: Wed Dec  5 22:21:07 2018
# .
/set type=dir
.               size=1152
# ./admin
admin           size=960
# ./admin/charsets
charsets        size=544
# ./admin/charsets/glibc
glibc           size=3392
# ./admin/charsets/glibc
..
# ./admin/charsets/mapfiles
mapfiles        size=640
# ./admin/charsets/mapfiles
..

Update 2

I've added Emacs ediff to the mix:

(require 'f)

(defun ar/ediff-dir-content-size ()
    "Diff all subdirectories (sizes only) in two directories."
    (interactive)
    (let* ((dir1-path (read-directory-name "Dir 1: "))
           (dir2-path (read-directory-name "Dir 2: "))
           (buf1 (get-buffer-create (format "*Dir 1 (%s)*" (f-base dir1-path))))
           (buf2 (get-buffer-create (format "*Dir 2 (%s)*" (f-base dir2-path)))))
      (with-current-buffer buf1
        (erase-buffer))
      (with-current-buffer buf2
        (erase-buffer))
      (shell-command (format "cd %s; find . -type d | sort | du -h" dir1-path) buf1)
      (shell-command (format "cd %s; find . -type d | sort | du -h" dir2-path) buf2)
      (ediff-buffers buf1 buf2)))