@@ -0,0 +1,2886 @@
+package net.folab.finddiff;%0A%0Aimport java.io.File;%0Aimport java.io.FileNotFoundException;%0Aimport java.io.IOException;%0Aimport java.util.Arrays;%0Aimport java.util.ArrayList;%0Aimport java.util.Collections;%0Aimport java.util.HashSet;%0Aimport java.util.List;%0A%0Apublic class FindDiff %7B%0A%0A    public static void main(String%5B%5D args) throws IOException %7B%0A%0A        if (args.length != 2) %7B%0A            usage();%0A            return;%0A        %7D%0A%0A        findDiff(new File(args%5B0%5D), new File(args%5B1%5D), %22%22);%0A%0A    %7D%0A%0A    public static void usage() %7B%0A        String className = FindDiff.class.getName();%0A        System.out.println(%22Usage: %22);%0A        System.out.println(%22  java %22 + className + %22 DIR1 DIR2%22);%0A        System.out.println(%22  java %22 + className + %22 FILE1 FILE2%22);%0A    %7D%0A%0A    public static void findDiff(File lBase, File rBase, String path) %7B%0A%0A        File lFile = new File(lBase, path);%0A        File rFile = new File(rBase, path);%0A%0A        if (!lFile.exists()) %7B%0A            if (!rFile.exists()) %7B%0A                System.out.println(%22!   %22 + path);%0A                return;%0A            %7D else %7B%0A                System.out.println(%22+   %22 + path);%0A                return;%0A            %7D%0A        %7D else %7B%0A            if (!rFile.exists()) %7B%0A                System.out.println(%22-   %22 + path);%0A                return;%0A            %7D%0A        %7D%0A%0A        if (lFile.isFile()) %7B%0A            if (rFile.isFile()) %7B%0A                findFileDiff(lFile, rFile, path);%0A                return;%0A            %7D else if (rFile.isDirectory()) %7B%0A                System.out.println(%22%3C   %22 + path);%0A                return;%0A            %7D else %7B%0A                System.out.println(%22?   %22 + path);%0A                System.out.println(%22    Unexpected case: left is file but right is neither file nor directory%22);%0A                return;%0A                //throw new RuntimeException(%22Unexpected case: left is file but right is neither file nor directory - %22 + path);%0A            %7D%0A        %7D else if (lFile.isDirectory()) %7B%0A            if (rFile.isDirectory()) %7B%0A                List%3CString%3E names = new ArrayList%3CString%3E(Arrays.asList(lFile.list()));%0A                names.addAll(Arrays.asList(rFile.list()));%0A                names = new ArrayList%3CString%3E(new HashSet%3CString%3E(names));%0A                Collections.sort(names);%0A                for (String name : names)%0A                    findDiff(lBase, rBase, path + File.separator + name);%0A            %7D else if (rFile.isFile()) %7B%0A                System.out.println(%22%3E   %22 + path);%0A                return;%0A            %7D else %7B%0A                throw new RuntimeException(%22Unexpected case: left is directory but right is neither directory nor file - %22 + path);%0A            %7D%0A        %7D%0A    %7D%0A%0A    public static void findFileDiff(File lFile, File rFile, String path) %7B%0A        if (lFile.length() != rFile.length()) %7B%0A                System.out.println(%22*   %22 + path);%0A        %7D%0A    %7D%0A%0A%7D%0A

Add FindDiff main java class.