You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/12/20 20:35:39 UTC

[camel] branch master updated: CAMEL-15979: camel-file/camel-ftp - Add includeExt/excludeExt to make it easy to filter based on file extension

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new cbd08f6  CAMEL-15979: camel-file/camel-ftp - Add includeExt/excludeExt to make it easy to filter based on file extension
cbd08f6 is described below

commit cbd08f6bc6b4f4cce9621309b201ce8360a5f0ad
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Dec 20 20:44:50 2020 +0100

    CAMEL-15979: camel-file/camel-ftp - Add includeExt/excludeExt to make it easy to filter based on file extension
---
 .../apache/camel/catalog/docs/file-component.adoc  |  4 +-
 .../apache/camel/catalog/docs/ftp-component.adoc   |  4 +-
 .../apache/camel/catalog/docs/ftps-component.adoc  |  4 +-
 .../apache/camel/catalog/docs/sftp-component.adoc  |  4 +-
 .../component/file/FileEndpointConfigurer.java     | 12 +++++
 .../component/file/FileEndpointUriFactory.java     |  4 +-
 .../org/apache/camel/component/file/file.json      |  2 +
 .../camel-file/src/main/docs/file-component.adoc   |  4 +-
 .../camel/component/file/GenericFileConsumer.java  | 23 ++++++++
 .../camel/component/file/GenericFileEndpoint.java  | 34 ++++++++++++
 .../file/remote/FtpEndpointConfigurer.java         | 12 +++++
 .../file/remote/FtpEndpointUriFactory.java         |  4 +-
 .../file/remote/FtpsEndpointUriFactory.java        |  4 +-
 .../file/remote/SftpEndpointConfigurer.java        | 12 +++++
 .../file/remote/SftpEndpointUriFactory.java        |  4 +-
 .../apache/camel/component/file/remote/ftp.json    |  2 +
 .../apache/camel/component/file/remote/ftps.json   |  2 +
 .../apache/camel/component/file/remote/sftp.json   |  2 +
 .../camel-ftp/src/main/docs/ftp-component.adoc     |  4 +-
 .../camel-ftp/src/main/docs/ftps-component.adoc    |  4 +-
 .../camel-ftp/src/main/docs/sftp-component.adoc    |  4 +-
 .../file/remote/FtpConsumerExcludeExtTest.java     | 63 ++++++++++++++++++++++
 .../file/remote/FtpConsumerIncludeExtTest.java     | 63 ++++++++++++++++++++++
 .../component/file/FileConsumerExcludeExtTest.java | 57 ++++++++++++++++++++
 .../component/file/FileConsumerIncludeExtTest.java | 57 ++++++++++++++++++++
 .../endpoint/dsl/FileEndpointBuilderFactory.java   | 34 ++++++++++++
 .../endpoint/dsl/FtpEndpointBuilderFactory.java    | 34 ++++++++++++
 .../endpoint/dsl/FtpsEndpointBuilderFactory.java   | 34 ++++++++++++
 .../endpoint/dsl/SftpEndpointBuilderFactory.java   | 34 ++++++++++++
 .../modules/ROOT/pages/file-component.adoc         |  4 +-
 .../modules/ROOT/pages/ftp-component.adoc          |  4 +-
 .../modules/ROOT/pages/ftps-component.adoc         |  4 +-
 .../modules/ROOT/pages/sftp-component.adoc         |  4 +-
 33 files changed, 525 insertions(+), 16 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/file-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/file-component.adoc
index 7d515a6..6746b81 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/file-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/file-component.adoc
@@ -96,7 +96,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (91 parameters):
+=== Query Parameters (93 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -150,6 +150,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -157,6 +158,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftp-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftp-component.adoc
index 37244b6..dade782 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftp-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftp-component.adoc
@@ -112,7 +112,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (109 parameters):
+=== Query Parameters (111 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -185,6 +185,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -192,6 +193,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftps-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftps-component.adoc
index fdb2a38..c97b679 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftps-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ftps-component.adoc
@@ -71,7 +71,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (117 parameters):
+=== Query Parameters (119 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -144,6 +144,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -151,6 +152,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/sftp-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/sftp-component.adoc
index 2008f6a..235324c 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/sftp-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/sftp-component.adoc
@@ -70,7 +70,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (120 parameters):
+=== Query Parameters (122 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -139,6 +139,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -146,6 +147,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointConfigurer.java b/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointConfigurer.java
index d858056..1e914ba 100644
--- a/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointConfigurer.java
+++ b/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointConfigurer.java
@@ -64,6 +64,8 @@ public class FileEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
         case "exclude": target.setExclude(property(camelContext, java.lang.String.class, value)); return true;
+        case "excludeext":
+        case "excludeExt": target.setExcludeExt(property(camelContext, java.lang.String.class, value)); return true;
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": target.setExclusiveReadLockStrategy(property(camelContext, org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.class, value)); return true;
         case "extendedattributes":
@@ -89,6 +91,8 @@ public class FileEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": target.setInProgressRepository(property(camelContext, org.apache.camel.spi.IdempotentRepository.class, value)); return true;
         case "include": target.setInclude(property(camelContext, java.lang.String.class, value)); return true;
+        case "includeext":
+        case "includeExt": target.setIncludeExt(property(camelContext, java.lang.String.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
         case "jailstartingdirectory":
@@ -236,6 +240,8 @@ public class FileEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return org.apache.camel.ExchangePattern.class;
         case "exclude": return java.lang.String.class;
+        case "excludeext":
+        case "excludeExt": return java.lang.String.class;
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": return org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.class;
         case "extendedattributes":
@@ -261,6 +267,8 @@ public class FileEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": return org.apache.camel.spi.IdempotentRepository.class;
         case "include": return java.lang.String.class;
+        case "includeext":
+        case "includeExt": return java.lang.String.class;
         case "initialdelay":
         case "initialDelay": return long.class;
         case "jailstartingdirectory":
@@ -409,6 +417,8 @@ public class FileEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return target.getExchangePattern();
         case "exclude": return target.getExclude();
+        case "excludeext":
+        case "excludeExt": return target.getExcludeExt();
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": return target.getExclusiveReadLockStrategy();
         case "extendedattributes":
@@ -434,6 +444,8 @@ public class FileEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": return target.getInProgressRepository();
         case "include": return target.getInclude();
+        case "includeext":
+        case "includeExt": return target.getIncludeExt();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
         case "jailstartingdirectory":
diff --git a/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointUriFactory.java b/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointUriFactory.java
index 888b42e..8387a9d 100644
--- a/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointUriFactory.java
+++ b/components/camel-file/src/generated/java/org/apache/camel/component/file/FileEndpointUriFactory.java
@@ -20,7 +20,7 @@ public class FileEndpointUriFactory extends org.apache.camel.support.component.E
     private static final Set<String> PROPERTY_NAMES;
     private static final Set<String> SECRET_PROPERTY_NAMES;
     static {
-        Set<String> props = new HashSet<>(92);
+        Set<String> props = new HashSet<>(94);
         props.add("renameUsingCopy");
         props.add("moveExistingFileStrategy");
         props.add("fileName");
@@ -74,6 +74,7 @@ public class FileEndpointUriFactory extends org.apache.camel.support.component.E
         props.add("startingDirectoryMustExist");
         props.add("directoryMustExist");
         props.add("autoCreate");
+        props.add("includeExt");
         props.add("readLockIdempotentReleaseAsyncPoolSize");
         props.add("delete");
         props.add("readLockMinAge");
@@ -110,6 +111,7 @@ public class FileEndpointUriFactory extends org.apache.camel.support.component.E
         props.add("forceWrites");
         props.add("antFilterCaseSensitive");
         props.add("shuffle");
+        props.add("excludeExt");
         props.add("chmodDirectory");
         props.add("bufferSize");
         props.add("filterDirectory");
diff --git a/components/camel-file/src/generated/resources/org/apache/camel/component/file/file.json b/components/camel-file/src/generated/resources/org/apache/camel/component/file/file.json
index 0433844..767c4b4 100644
--- a/components/camel-file/src/generated/resources/org/apache/camel/component/file/file.json
+++ b/components/camel-file/src/generated/resources/org/apache/camel/component/file/file.json
@@ -76,6 +76,7 @@
     "antInclude": { "kind": "parameter", "displayName": "Ant Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format." },
     "eagerMaxMessagesPerPoll": { "kind": "parameter", "displayName": "Eager Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then per [...]
     "exclude": { "kind": "parameter", "displayName": "Exclude", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpo [...]
+    "excludeExt": { "kind": "parameter", "displayName": "Exclude Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use exclu [...]
     "filter": { "kind": "parameter", "displayName": "Filter", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.component.file.GenericFileFilter<java.io.File>", "deprecated": false, "autowired": false, "secret": false, "description": "Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method." },
     "filterDirectory": { "kind": "parameter", "displayName": "Filter Directory", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}" },
     "filterFile": { "kind": "parameter", "displayName": "Filter File", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000" },
@@ -83,6 +84,7 @@
     "idempotentKey": { "kind": "parameter", "displayName": "Idempotent Key", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size}" },
     "idempotentRepository": { "kind": "parameter", "displayName": "Idempotent Repository", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true." },
     "include": { "kind": "parameter", "displayName": "Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endp [...]
+    "includeExt": { "kind": "parameter", "displayName": "Include Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use inclu [...]
     "maxDepth": { "kind": "parameter", "displayName": "Max Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2147483647, "description": "The maximum depth to traverse when recursively processing a directory." },
     "maxMessagesPerPoll": { "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to di [...]
     "minDepth": { "kind": "parameter", "displayName": "Min Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory." },
diff --git a/components/camel-file/src/main/docs/file-component.adoc b/components/camel-file/src/main/docs/file-component.adoc
index 7d515a6..6746b81 100644
--- a/components/camel-file/src/main/docs/file-component.adoc
+++ b/components/camel-file/src/main/docs/file-component.adoc
@@ -96,7 +96,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (91 parameters):
+=== Query Parameters (93 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -150,6 +150,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -157,6 +158,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
index 3170e4e..3e6a7b4 100644
--- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
+++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
@@ -35,6 +35,7 @@ import org.apache.camel.support.EmptyAsyncCallback;
 import org.apache.camel.support.ScheduledBatchPollingConsumer;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.CastUtils;
+import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.StopWatch;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.TimeUtils;
@@ -58,6 +59,8 @@ public abstract class GenericFileConsumer<T> extends ScheduledBatchPollingConsum
     protected volatile boolean prepareOnStartup;
     private final Pattern includePattern;
     private final Pattern excludePattern;
+    private final String[] includeExt;
+    private final String[] excludeExt;
 
     public GenericFileConsumer(GenericFileEndpoint<T> endpoint, Processor processor, GenericFileOperations<T> operations,
                                GenericFileProcessStrategy<T> processStrategy) {
@@ -68,6 +71,8 @@ public abstract class GenericFileConsumer<T> extends ScheduledBatchPollingConsum
 
         this.includePattern = endpoint.getIncludePattern();
         this.excludePattern = endpoint.getExcludePattern();
+        this.includeExt = endpoint.getIncludeExt() != null ? endpoint.getIncludeExt().split(",") : null;
+        this.excludeExt = endpoint.getExcludeExt() != null ? endpoint.getExcludeExt().split(",") : null;
     }
 
     public Processor getCustomProcessor() {
@@ -666,11 +671,29 @@ public abstract class GenericFileConsumer<T> extends ScheduledBatchPollingConsum
                 return false;
             }
         }
+        if (excludeExt != null) {
+            String ext = FileUtil.onlyExt(file.getFileName());
+            for (String exclude : excludeExt) {
+                if (exclude.equalsIgnoreCase(ext)) {
+                    return false;
+                }
+            }
+        }
         if (includePattern != null) {
             if (!includePattern.matcher(name).matches()) {
                 return false;
             }
         }
+        if (includeExt != null) {
+            String ext = FileUtil.onlyExt(file.getFileName());
+            boolean any = false;
+            for (String include : includeExt) {
+                any |= include.equalsIgnoreCase(ext);
+            }
+            if (!any) {
+                return false;
+            }
+        }
 
         if (endpoint.getFileName() != null) {
             // create a dummy exchange as Exchange is needed for expression evaluation
diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
index 00c912b..e044f6d 100644
--- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
+++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
@@ -228,6 +228,14 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
                                                        + ""
                                                        + "endpoint uris</a>")
     protected String exclude;
+    @UriParam(label = "consumer,filter",
+              description = "Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt."
+                            + " Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml")
+    protected String includeExt;
+    @UriParam(label = "consumer,filter",
+              description = "Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak."
+                            + " Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat.")
+    protected String excludeExt;
     @UriParam(label = "consumer,filter", javaType = "java.lang.String", description = "Expression (such as Simple "
                                                                                       + "Language) used to dynamically set the filename when moving it after processing. To move files into "
                                                                                       + "a .done subdirectory just enter .done.")
@@ -599,6 +607,32 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
         return antFilter;
     }
 
+    public String getIncludeExt() {
+        return includeExt;
+    }
+
+    /**
+     * Is used to include files matching file extension name (case insensitive). For example to include txt files, then
+     * use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use
+     * includeExt=txt,xml
+     */
+    public void setIncludeExt(String includeExt) {
+        this.includeExt = includeExt;
+    }
+
+    public String getExcludeExt() {
+        return excludeExt;
+    }
+
+    /**
+     * Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then
+     * use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use
+     * excludeExt=bak,dat.
+     */
+    public void setExcludeExt(String excludeExt) {
+        this.excludeExt = excludeExt;
+    }
+
     public boolean isPreSort() {
         return preSort;
     }
diff --git a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointConfigurer.java b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointConfigurer.java
index 318028e..e9516f77 100644
--- a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointConfigurer.java
+++ b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointConfigurer.java
@@ -66,6 +66,8 @@ public class FtpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
         case "exclude": target.setExclude(property(camelContext, java.lang.String.class, value)); return true;
+        case "excludeext":
+        case "excludeExt": target.setExcludeExt(property(camelContext, java.lang.String.class, value)); return true;
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": target.setExclusiveReadLockStrategy(property(camelContext, org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.class, value)); return true;
         case "fastexistscheck":
@@ -101,6 +103,8 @@ public class FtpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": target.setInProgressRepository(property(camelContext, org.apache.camel.spi.IdempotentRepository.class, value)); return true;
         case "include": target.setInclude(property(camelContext, java.lang.String.class, value)); return true;
+        case "includeext":
+        case "includeExt": target.setIncludeExt(property(camelContext, java.lang.String.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
         case "jailstartingdirectory":
@@ -265,6 +269,8 @@ public class FtpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return org.apache.camel.ExchangePattern.class;
         case "exclude": return java.lang.String.class;
+        case "excludeext":
+        case "excludeExt": return java.lang.String.class;
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": return org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.class;
         case "fastexistscheck":
@@ -300,6 +306,8 @@ public class FtpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": return org.apache.camel.spi.IdempotentRepository.class;
         case "include": return java.lang.String.class;
+        case "includeext":
+        case "includeExt": return java.lang.String.class;
         case "initialdelay":
         case "initialDelay": return long.class;
         case "jailstartingdirectory":
@@ -465,6 +473,8 @@ public class FtpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return target.getExchangePattern();
         case "exclude": return target.getExclude();
+        case "excludeext":
+        case "excludeExt": return target.getExcludeExt();
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": return target.getExclusiveReadLockStrategy();
         case "fastexistscheck":
@@ -500,6 +510,8 @@ public class FtpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": return target.getInProgressRepository();
         case "include": return target.getInclude();
+        case "includeext":
+        case "includeExt": return target.getIncludeExt();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
         case "jailstartingdirectory":
diff --git a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointUriFactory.java b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointUriFactory.java
index 320cfee..590bb5aa6 100644
--- a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointUriFactory.java
+++ b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpEndpointUriFactory.java
@@ -20,7 +20,7 @@ public class FtpEndpointUriFactory extends org.apache.camel.support.component.En
     private static final Set<String> PROPERTY_NAMES;
     private static final Set<String> SECRET_PROPERTY_NAMES;
     static {
-        Set<String> props = new HashSet<>(112);
+        Set<String> props = new HashSet<>(114);
         props.add("disconnect");
         props.add("moveExistingFileStrategy");
         props.add("fileName");
@@ -49,6 +49,7 @@ public class FtpEndpointUriFactory extends org.apache.camel.support.component.En
         props.add("maximumReconnectAttempts");
         props.add("stepwise");
         props.add("autoCreate");
+        props.add("includeExt");
         props.add("recursive");
         props.add("antExclude");
         props.add("keepLastModified");
@@ -72,6 +73,7 @@ public class FtpEndpointUriFactory extends org.apache.camel.support.component.En
         props.add("filterFile");
         props.add("pollStrategy");
         props.add("shuffle");
+        props.add("excludeExt");
         props.add("antInclude");
         props.add("moveExisting");
         props.add("throwExceptionOnConnectFailed");
diff --git a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpsEndpointUriFactory.java b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpsEndpointUriFactory.java
index 982be85..14b4882 100644
--- a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpsEndpointUriFactory.java
+++ b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/FtpsEndpointUriFactory.java
@@ -20,7 +20,7 @@ public class FtpsEndpointUriFactory extends org.apache.camel.support.component.E
     private static final Set<String> PROPERTY_NAMES;
     private static final Set<String> SECRET_PROPERTY_NAMES;
     static {
-        Set<String> props = new HashSet<>(120);
+        Set<String> props = new HashSet<>(122);
         props.add("disconnect");
         props.add("moveExistingFileStrategy");
         props.add("fileName");
@@ -54,6 +54,7 @@ public class FtpsEndpointUriFactory extends org.apache.camel.support.component.E
         props.add("stepwise");
         props.add("sslContextParameters");
         props.add("autoCreate");
+        props.add("includeExt");
         props.add("recursive");
         props.add("antExclude");
         props.add("keepLastModified");
@@ -77,6 +78,7 @@ public class FtpsEndpointUriFactory extends org.apache.camel.support.component.E
         props.add("filterFile");
         props.add("pollStrategy");
         props.add("shuffle");
+        props.add("excludeExt");
         props.add("antInclude");
         props.add("moveExisting");
         props.add("throwExceptionOnConnectFailed");
diff --git a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointConfigurer.java b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointConfigurer.java
index 0d63671..7d9212a 100644
--- a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointConfigurer.java
+++ b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointConfigurer.java
@@ -67,6 +67,8 @@ public class SftpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
         case "exclude": target.setExclude(property(camelContext, java.lang.String.class, value)); return true;
+        case "excludeext":
+        case "excludeExt": target.setExcludeExt(property(camelContext, java.lang.String.class, value)); return true;
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": target.setExclusiveReadLockStrategy(property(camelContext, org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.class, value)); return true;
         case "existdircheckusingls":
@@ -94,6 +96,8 @@ public class SftpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": target.setInProgressRepository(property(camelContext, org.apache.camel.spi.IdempotentRepository.class, value)); return true;
         case "include": target.setInclude(property(camelContext, java.lang.String.class, value)); return true;
+        case "includeext":
+        case "includeExt": target.setIncludeExt(property(camelContext, java.lang.String.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
         case "jailstartingdirectory":
@@ -286,6 +290,8 @@ public class SftpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return org.apache.camel.ExchangePattern.class;
         case "exclude": return java.lang.String.class;
+        case "excludeext":
+        case "excludeExt": return java.lang.String.class;
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": return org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy.class;
         case "existdircheckusingls":
@@ -313,6 +319,8 @@ public class SftpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": return org.apache.camel.spi.IdempotentRepository.class;
         case "include": return java.lang.String.class;
+        case "includeext":
+        case "includeExt": return java.lang.String.class;
         case "initialdelay":
         case "initialDelay": return long.class;
         case "jailstartingdirectory":
@@ -506,6 +514,8 @@ public class SftpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "exchangepattern":
         case "exchangePattern": return target.getExchangePattern();
         case "exclude": return target.getExclude();
+        case "excludeext":
+        case "excludeExt": return target.getExcludeExt();
         case "exclusivereadlockstrategy":
         case "exclusiveReadLockStrategy": return target.getExclusiveReadLockStrategy();
         case "existdircheckusingls":
@@ -533,6 +543,8 @@ public class SftpEndpointConfigurer extends PropertyConfigurerSupport implements
         case "inprogressrepository":
         case "inProgressRepository": return target.getInProgressRepository();
         case "include": return target.getInclude();
+        case "includeext":
+        case "includeExt": return target.getIncludeExt();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
         case "jailstartingdirectory":
diff --git a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointUriFactory.java b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointUriFactory.java
index b51f5f8..8aa04e7 100644
--- a/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointUriFactory.java
+++ b/components/camel-ftp/src/generated/java/org/apache/camel/component/file/remote/SftpEndpointUriFactory.java
@@ -20,7 +20,7 @@ public class SftpEndpointUriFactory extends org.apache.camel.support.component.E
     private static final Set<String> PROPERTY_NAMES;
     private static final Set<String> SECRET_PROPERTY_NAMES;
     static {
-        Set<String> props = new HashSet<>(123);
+        Set<String> props = new HashSet<>(125);
         props.add("disconnect");
         props.add("moveExistingFileStrategy");
         props.add("fileName");
@@ -56,6 +56,7 @@ public class SftpEndpointUriFactory extends org.apache.camel.support.component.E
         props.add("maximumReconnectAttempts");
         props.add("stepwise");
         props.add("autoCreate");
+        props.add("includeExt");
         props.add("recursive");
         props.add("antExclude");
         props.add("keepLastModified");
@@ -77,6 +78,7 @@ public class SftpEndpointUriFactory extends org.apache.camel.support.component.E
         props.add("filterFile");
         props.add("pollStrategy");
         props.add("shuffle");
+        props.add("excludeExt");
         props.add("knownHostsFile");
         props.add("antInclude");
         props.add("moveExisting");
diff --git a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json
index 665188b..8e0d465 100644
--- a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json
+++ b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json
@@ -99,6 +99,7 @@
     "antInclude": { "kind": "parameter", "displayName": "Ant Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format." },
     "eagerMaxMessagesPerPoll": { "kind": "parameter", "displayName": "Eager Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then per [...]
     "exclude": { "kind": "parameter", "displayName": "Exclude", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpo [...]
+    "excludeExt": { "kind": "parameter", "displayName": "Exclude Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use exclu [...]
     "filter": { "kind": "parameter", "displayName": "Filter", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.component.file.GenericFileFilter<org.apache.commons.net.ftp.FTPFile>", "deprecated": false, "autowired": false, "secret": false, "description": "Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method." },
     "filterDirectory": { "kind": "parameter", "displayName": "Filter Directory", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}" },
     "filterFile": { "kind": "parameter", "displayName": "Filter File", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000" },
@@ -106,6 +107,7 @@
     "idempotentKey": { "kind": "parameter", "displayName": "Idempotent Key", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size}" },
     "idempotentRepository": { "kind": "parameter", "displayName": "Idempotent Repository", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true." },
     "include": { "kind": "parameter", "displayName": "Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endp [...]
+    "includeExt": { "kind": "parameter", "displayName": "Include Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use inclu [...]
     "maxDepth": { "kind": "parameter", "displayName": "Max Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2147483647, "description": "The maximum depth to traverse when recursively processing a directory." },
     "maxMessagesPerPoll": { "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to di [...]
     "minDepth": { "kind": "parameter", "displayName": "Min Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory." },
diff --git a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json
index 58f7086..2f6db88 100644
--- a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json
+++ b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json
@@ -100,6 +100,7 @@
     "antInclude": { "kind": "parameter", "displayName": "Ant Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format." },
     "eagerMaxMessagesPerPoll": { "kind": "parameter", "displayName": "Eager Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then per [...]
     "exclude": { "kind": "parameter", "displayName": "Exclude", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpo [...]
+    "excludeExt": { "kind": "parameter", "displayName": "Exclude Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use exclu [...]
     "filter": { "kind": "parameter", "displayName": "Filter", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.component.file.GenericFileFilter<org.apache.commons.net.ftp.FTPFile>", "deprecated": false, "autowired": false, "secret": false, "description": "Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method." },
     "filterDirectory": { "kind": "parameter", "displayName": "Filter Directory", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}" },
     "filterFile": { "kind": "parameter", "displayName": "Filter File", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000" },
@@ -107,6 +108,7 @@
     "idempotentKey": { "kind": "parameter", "displayName": "Idempotent Key", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size}" },
     "idempotentRepository": { "kind": "parameter", "displayName": "Idempotent Repository", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true." },
     "include": { "kind": "parameter", "displayName": "Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endp [...]
+    "includeExt": { "kind": "parameter", "displayName": "Include Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use inclu [...]
     "maxDepth": { "kind": "parameter", "displayName": "Max Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2147483647, "description": "The maximum depth to traverse when recursively processing a directory." },
     "maxMessagesPerPoll": { "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to di [...]
     "minDepth": { "kind": "parameter", "displayName": "Min Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory." },
diff --git a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json
index 14cf0b5..79c1e6a 100644
--- a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json
+++ b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json
@@ -94,6 +94,7 @@
     "antInclude": { "kind": "parameter", "displayName": "Ant Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format." },
     "eagerMaxMessagesPerPoll": { "kind": "parameter", "displayName": "Eager Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then per [...]
     "exclude": { "kind": "parameter", "displayName": "Exclude", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpo [...]
+    "excludeExt": { "kind": "parameter", "displayName": "Exclude Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use exclu [...]
     "filter": { "kind": "parameter", "displayName": "Filter", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.component.file.GenericFileFilter<org.apache.camel.component.file.remote.SftpRemoteFile>", "deprecated": false, "autowired": false, "secret": false, "description": "Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method." },
     "filterDirectory": { "kind": "parameter", "displayName": "Filter Directory", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}" },
     "filterFile": { "kind": "parameter", "displayName": "Filter File", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000" },
@@ -101,6 +102,7 @@
     "idempotentKey": { "kind": "parameter", "displayName": "Idempotent Key", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size}" },
     "idempotentRepository": { "kind": "parameter", "displayName": "Idempotent Repository", "group": "filter", "label": "consumer,filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true." },
     "include": { "kind": "parameter", "displayName": "Include", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endp [...]
+    "includeExt": { "kind": "parameter", "displayName": "Include Ext", "group": "filter", "label": "consumer,filter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use inclu [...]
     "maxDepth": { "kind": "parameter", "displayName": "Max Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2147483647, "description": "The maximum depth to traverse when recursively processing a directory." },
     "maxMessagesPerPoll": { "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to di [...]
     "minDepth": { "kind": "parameter", "displayName": "Min Depth", "group": "filter", "label": "consumer,filter", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory." },
diff --git a/components/camel-ftp/src/main/docs/ftp-component.adoc b/components/camel-ftp/src/main/docs/ftp-component.adoc
index 37244b6..dade782 100644
--- a/components/camel-ftp/src/main/docs/ftp-component.adoc
+++ b/components/camel-ftp/src/main/docs/ftp-component.adoc
@@ -112,7 +112,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (109 parameters):
+=== Query Parameters (111 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -185,6 +185,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -192,6 +193,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/components/camel-ftp/src/main/docs/ftps-component.adoc b/components/camel-ftp/src/main/docs/ftps-component.adoc
index fdb2a38..c97b679 100644
--- a/components/camel-ftp/src/main/docs/ftps-component.adoc
+++ b/components/camel-ftp/src/main/docs/ftps-component.adoc
@@ -71,7 +71,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (117 parameters):
+=== Query Parameters (119 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -144,6 +144,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -151,6 +152,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/components/camel-ftp/src/main/docs/sftp-component.adoc b/components/camel-ftp/src/main/docs/sftp-component.adoc
index 2008f6a..235324c 100644
--- a/components/camel-ftp/src/main/docs/sftp-component.adoc
+++ b/components/camel-ftp/src/main/docs/sftp-component.adoc
@@ -70,7 +70,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (120 parameters):
+=== Query Parameters (122 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -139,6 +139,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -146,6 +147,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerExcludeExtTest.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerExcludeExtTest.java
new file mode 100644
index 0000000..8a9d552
--- /dev/null
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerExcludeExtTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.remote;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class FtpConsumerExcludeExtTest extends FtpServerTestSupport {
+
+    private String getFtpUrl() {
+        return "ftp://admin@localhost:{{ftp.server.port}}/includename?password=admin" + "&excludeExt=xml";
+    }
+
+    @Override
+    @BeforeEach
+    public void setUp() throws Exception {
+        super.setUp();
+        prepareFtpServer();
+    }
+
+    @Test
+    public void testIncludeExt() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceivedInAnyOrder("Report 1", "Bye World");
+
+        mock.assertIsSatisfied();
+    }
+
+    private void prepareFtpServer() throws Exception {
+        // prepares the FTP Server by creating files on the server that we want
+        // to unit
+        // test that we can pool and store as a local file
+        sendFile(getFtpUrl(), "Hello World", "hello.xml");
+        sendFile(getFtpUrl(), "Report 1", "report1.txt");
+        sendFile(getFtpUrl(), "Bye World", "secret.DAT");
+        sendFile(getFtpUrl(), "Report 2", "report2.xml");
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from(getFtpUrl()).to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerIncludeExtTest.java b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerIncludeExtTest.java
new file mode 100644
index 0000000..288db89
--- /dev/null
+++ b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConsumerIncludeExtTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.remote;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class FtpConsumerIncludeExtTest extends FtpServerTestSupport {
+
+    private String getFtpUrl() {
+        return "ftp://admin@localhost:{{ftp.server.port}}/includename?password=admin" + "&includeExt=txt,dat";
+    }
+
+    @Override
+    @BeforeEach
+    public void setUp() throws Exception {
+        super.setUp();
+        prepareFtpServer();
+    }
+
+    @Test
+    public void testIncludeExt() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceivedInAnyOrder("Report 1", "Bye World");
+
+        mock.assertIsSatisfied();
+    }
+
+    private void prepareFtpServer() throws Exception {
+        // prepares the FTP Server by creating files on the server that we want
+        // to unit
+        // test that we can pool and store as a local file
+        sendFile(getFtpUrl(), "Hello World", "hello.xml");
+        sendFile(getFtpUrl(), "Report 1", "report1.txt");
+        sendFile(getFtpUrl(), "Bye World", "secret.DAT");
+        sendFile(getFtpUrl(), "Report 2", "report2.xml");
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from(getFtpUrl()).to("mock:result");
+            }
+        };
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExcludeExtTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExcludeExtTest.java
new file mode 100644
index 0000000..7cf5a95
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerExcludeExtTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class FileConsumerExcludeExtTest extends ContextTestSupport {
+
+    @Override
+    @BeforeEach
+    public void setUp() throws Exception {
+        deleteDirectory("target/data/inbox");
+        super.setUp();
+    }
+
+    @Test
+    public void testFileConsumer() throws Exception {
+        getMockEndpoint("mock:txt").expectedBodiesReceivedInAnyOrder("Hello World", "Bye World");
+
+        template.sendBodyAndHeader("file:target/inbox", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:target/inbox", "<customer>123</customer>", Exchange.FILE_NAME, "customer.xml");
+        template.sendBodyAndHeader("file:target/inbox", "123", Exchange.FILE_NAME, "order.dat");
+        template.sendBodyAndHeader("file:target/inbox", "<book>Camel Rocks</book>", Exchange.FILE_NAME, "book.Xml");
+        template.sendBodyAndHeader("file:target/inbox", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/inbox?initialDelay=0&delay=10&excludeExt=XML,dat")
+                        .to("mock:txt");
+            }
+        };
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerIncludeExtTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerIncludeExtTest.java
new file mode 100644
index 0000000..afff18e
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerIncludeExtTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class FileConsumerIncludeExtTest extends ContextTestSupport {
+
+    @Override
+    @BeforeEach
+    public void setUp() throws Exception {
+        deleteDirectory("target/data/inbox");
+        super.setUp();
+    }
+
+    @Test
+    public void testFileConsumer() throws Exception {
+        getMockEndpoint("mock:txt").expectedBodiesReceivedInAnyOrder("Hello World", "123", "Bye World");
+
+        template.sendBodyAndHeader("file:target/inbox", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:target/inbox", "<customer>123</customer>", Exchange.FILE_NAME, "customer.xml");
+        template.sendBodyAndHeader("file:target/inbox", "123", Exchange.FILE_NAME, "order.DAT");
+        template.sendBodyAndHeader("file:target/inbox", "<book>Camel Rocks</book>", Exchange.FILE_NAME, "book.xml");
+        template.sendBodyAndHeader("file:target/inbox", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/inbox?initialDelay=0&delay=10&includeExt=txt,dat")
+                        .to("mock:txt");
+            }
+        };
+    }
+}
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FileEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FileEndpointBuilderFactory.java
index bc5fef1..bbce14f 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FileEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FileEndpointBuilderFactory.java
@@ -575,6 +575,23 @@ public interface FileEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to exclude files matching file extension name (case
+         * insensitive). For example to exclude bak files, then use
+         * excludeExt=bak. Multiple extensions can be separated by comma, for
+         * example to exclude bak and dat files, use excludeExt=bak,dat.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param excludeExt the value to set
+         * @return the dsl builder
+         */
+        default FileEndpointConsumerBuilder excludeExt(String excludeExt) {
+            doSetProperty("excludeExt", excludeExt);
+            return this;
+        }
+        /**
          * Pluggable filter as a
          * org.apache.camel.component.file.GenericFileFilter class. Will skip
          * files if filter returns false in its accept() method.
@@ -807,6 +824,23 @@ public interface FileEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to include files matching file extension name (case
+         * insensitive). For example to include txt files, then use
+         * includeExt=txt. Multiple extensions can be separated by comma, for
+         * example to include txt and xml files, use includeExt=txt,xml.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param includeExt the value to set
+         * @return the dsl builder
+         */
+        default FileEndpointConsumerBuilder includeExt(String includeExt) {
+            doSetProperty("includeExt", includeExt);
+            return this;
+        }
+        /**
          * The maximum depth to traverse when recursively processing a
          * directory.
          * 
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpEndpointBuilderFactory.java
index a1459f7..bac23ab 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpEndpointBuilderFactory.java
@@ -899,6 +899,23 @@ public interface FtpEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to exclude files matching file extension name (case
+         * insensitive). For example to exclude bak files, then use
+         * excludeExt=bak. Multiple extensions can be separated by comma, for
+         * example to exclude bak and dat files, use excludeExt=bak,dat.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param excludeExt the value to set
+         * @return the dsl builder
+         */
+        default FtpEndpointConsumerBuilder excludeExt(String excludeExt) {
+            doSetProperty("excludeExt", excludeExt);
+            return this;
+        }
+        /**
          * Pluggable filter as a
          * org.apache.camel.component.file.GenericFileFilter class. Will skip
          * files if filter returns false in its accept() method.
@@ -1131,6 +1148,23 @@ public interface FtpEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to include files matching file extension name (case
+         * insensitive). For example to include txt files, then use
+         * includeExt=txt. Multiple extensions can be separated by comma, for
+         * example to include txt and xml files, use includeExt=txt,xml.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param includeExt the value to set
+         * @return the dsl builder
+         */
+        default FtpEndpointConsumerBuilder includeExt(String includeExt) {
+            doSetProperty("includeExt", includeExt);
+            return this;
+        }
+        /**
          * The maximum depth to traverse when recursively processing a
          * directory.
          * 
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpsEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpsEndpointBuilderFactory.java
index 4768960..2ccce97 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpsEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FtpsEndpointBuilderFactory.java
@@ -901,6 +901,23 @@ public interface FtpsEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to exclude files matching file extension name (case
+         * insensitive). For example to exclude bak files, then use
+         * excludeExt=bak. Multiple extensions can be separated by comma, for
+         * example to exclude bak and dat files, use excludeExt=bak,dat.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param excludeExt the value to set
+         * @return the dsl builder
+         */
+        default FtpsEndpointConsumerBuilder excludeExt(String excludeExt) {
+            doSetProperty("excludeExt", excludeExt);
+            return this;
+        }
+        /**
          * Pluggable filter as a
          * org.apache.camel.component.file.GenericFileFilter class. Will skip
          * files if filter returns false in its accept() method.
@@ -1133,6 +1150,23 @@ public interface FtpsEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to include files matching file extension name (case
+         * insensitive). For example to include txt files, then use
+         * includeExt=txt. Multiple extensions can be separated by comma, for
+         * example to include txt and xml files, use includeExt=txt,xml.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param includeExt the value to set
+         * @return the dsl builder
+         */
+        default FtpsEndpointConsumerBuilder includeExt(String includeExt) {
+            doSetProperty("includeExt", includeExt);
+            return this;
+        }
+        /**
          * The maximum depth to traverse when recursively processing a
          * directory.
          * 
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SftpEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SftpEndpointBuilderFactory.java
index 9026f51..3f00dc6 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SftpEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SftpEndpointBuilderFactory.java
@@ -791,6 +791,23 @@ public interface SftpEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to exclude files matching file extension name (case
+         * insensitive). For example to exclude bak files, then use
+         * excludeExt=bak. Multiple extensions can be separated by comma, for
+         * example to exclude bak and dat files, use excludeExt=bak,dat.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param excludeExt the value to set
+         * @return the dsl builder
+         */
+        default SftpEndpointConsumerBuilder excludeExt(String excludeExt) {
+            doSetProperty("excludeExt", excludeExt);
+            return this;
+        }
+        /**
          * Pluggable filter as a
          * org.apache.camel.component.file.GenericFileFilter class. Will skip
          * files if filter returns false in its accept() method.
@@ -1023,6 +1040,23 @@ public interface SftpEndpointBuilderFactory {
             return this;
         }
         /**
+         * Is used to include files matching file extension name (case
+         * insensitive). For example to include txt files, then use
+         * includeExt=txt. Multiple extensions can be separated by comma, for
+         * example to include txt and xml files, use includeExt=txt,xml.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: filter
+         * 
+         * @param includeExt the value to set
+         * @return the dsl builder
+         */
+        default SftpEndpointConsumerBuilder includeExt(String includeExt) {
+            doSetProperty("includeExt", includeExt);
+            return this;
+        }
+        /**
          * The maximum depth to traverse when recursively processing a
          * directory.
          * 
diff --git a/docs/components/modules/ROOT/pages/file-component.adoc b/docs/components/modules/ROOT/pages/file-component.adoc
index 902e0fa..823e64f 100644
--- a/docs/components/modules/ROOT/pages/file-component.adoc
+++ b/docs/components/modules/ROOT/pages/file-component.adoc
@@ -98,7 +98,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (91 parameters):
+=== Query Parameters (93 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -152,6 +152,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -159,6 +160,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/docs/components/modules/ROOT/pages/ftp-component.adoc b/docs/components/modules/ROOT/pages/ftp-component.adoc
index 68eb694..9bd620d 100644
--- a/docs/components/modules/ROOT/pages/ftp-component.adoc
+++ b/docs/components/modules/ROOT/pages/ftp-component.adoc
@@ -114,7 +114,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (109 parameters):
+=== Query Parameters (111 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -187,6 +187,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -194,6 +195,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/docs/components/modules/ROOT/pages/ftps-component.adoc b/docs/components/modules/ROOT/pages/ftps-component.adoc
index 9aa38e2..d01c85d 100644
--- a/docs/components/modules/ROOT/pages/ftps-component.adoc
+++ b/docs/components/modules/ROOT/pages/ftps-component.adoc
@@ -73,7 +73,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (117 parameters):
+=== Query Parameters (119 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -146,6 +146,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -153,6 +154,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int
diff --git a/docs/components/modules/ROOT/pages/sftp-component.adoc b/docs/components/modules/ROOT/pages/sftp-component.adoc
index cc89166..8701d9f 100644
--- a/docs/components/modules/ROOT/pages/sftp-component.adoc
+++ b/docs/components/modules/ROOT/pages/sftp-component.adoc
@@ -72,7 +72,7 @@ with the following path and query parameters:
 |===
 
 
-=== Query Parameters (120 parameters):
+=== Query Parameters (122 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
@@ -141,6 +141,7 @@ with the following path and query parameters:
 | *antInclude* (filter) | Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format. |  | String
 | *eagerMaxMessagesPerPoll* (filter) | Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting. | true | boolean
 | *exclude* (filter) | Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *excludeExt* (filter) | Is used to exclude files matching file extension name (case insensitive). For example to exclude bak files, then use excludeExt=bak. Multiple extensions can be separated by comma, for example to exclude bak and dat files, use excludeExt=bak,dat. |  | String
 | *filter* (filter) | Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method. |  | GenericFileFilter
 | *filterDirectory* (filter) | Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd} |  | String
 | *filterFile* (filter) | Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000 |  | String
@@ -148,6 +149,7 @@ with the following path and query parameters:
 | *idempotentKey* (filter) | To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey=${file:name}-${file:size} |  | String
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true. |  | IdempotentRepository
 | *include* (filter) | Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris |  | String
+| *includeExt* (filter) | Is used to include files matching file extension name (case insensitive). For example to include txt files, then use includeExt=txt. Multiple extensions can be separated by comma, for example to include txt and xml files, use includeExt=txt,xml |  | String
 | *maxDepth* (filter) | The maximum depth to traverse when recursively processing a directory. | 2147483647 | int
 | *maxMessagesPerPoll* (filter) | To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll=500, then only the first 500 files will be picked up, and the [...]
 | *minDepth* (filter) | The minimum depth to start processing when recursively processing a directory. Using minDepth=1 means the base directory. Using minDepth=2 means the first sub directory. |  | int