exclude prefixes where possible
diff --git a/src/main/org/apache/ant/s3/S3Finder.java b/src/main/org/apache/ant/s3/S3Finder.java
index 659312a..95698ea 100644
--- a/src/main/org/apache/ant/s3/S3Finder.java
+++ b/src/main/org/apache/ant/s3/S3Finder.java
@@ -122,6 +122,7 @@
         final String prefix;
         final TokenizedPath path;
         final Set<TokenizedPattern> includes;
+        final Set<TokenizedPattern> excludes;
         final int maxDepth;
         final Iterator<CommonPrefix> prefixes;
         final Iterator<Atom<?>> contents;
@@ -135,11 +136,12 @@
 
             path = finder.path(prefix.get());
             includes = finder.patterns.getLeft();
+            excludes = finder.patterns.getRight();
             maxDepth = includes.stream().mapToInt(
                 include -> include.containsPattern(SelectorUtils.DEEP_TREE_MATCH) ? Integer.MAX_VALUE : include.depth())
                 .max().orElse(Integer.MAX_VALUE);
 
-            if (includes.isEmpty()) {
+            if (includes.isEmpty() && excludes.isEmpty()) {
                 this.prefixes = prefixes.iterator();
             } else {
                 final int recurseDepth = path.depth() + (finder.includePrefixes ? 0 : 1);
@@ -161,7 +163,12 @@
         }
 
         final boolean allowPrefix(CommonPrefix prefix) {
-            return includes.stream().anyMatch(p -> p.matchStartOf(finder.path(prefix.prefix()), finder.caseSensitive));
+            final TokenizedPath asPath = finder.path(prefix.prefix());
+            if (maxDepth == asPath.depth()
+                && excludes.stream().anyMatch(p -> p.matchPath(asPath, finder.caseSensitive))) {
+                return false;
+            }
+            return includes.stream().anyMatch(p -> p.matchStartOf(asPath, finder.caseSensitive));
         }
 
         final boolean allow(Atom<?> atom) {