A friend asked me to help him with the following in Bash - delete all files but a whitelisted and use mix / max depth for directory traversal. It's probably possible in Bash with some crazy find, grep, etc one-liner.

But here's how good it looks in Java 8 with streams, predicates, etc...

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class DeleteFiles {

	final static int MIN_DEPTH = 2;
	final static int MAX_DEPTH = 2;
	final static String ROOT_DIR = "/home/example";
	final static String WHITELISTED_FILE = "test.txt";

	public static <T> Predicate<T> not(Predicate<T> t) {
		return t.negate();

	public static void main(String[] args) {
		try {
			try (Stream<Path> paths = Files.find(Paths.get(ROOT_DIR), MAX_DEPTH, (path, file) -> file.isRegularFile())
			        .filter(e -> e.getNameCount() - Paths.get(ROOT_DIR).getNameCount() >= MIN_DEPTH)
			        .filter(not(s -> s.toString().endsWith(File.separator + WHITELISTED_FILE)))) {
						    System.out.println("To delete: " + file);

		} catch (IOException e) {

With Java you can also easily extend the above functionality. Imagine the Bash hell you'll get into when trying to whitelist a second file for example... Ahh, and it also works on Windows :)