concat
is a Zsh function designed to merge the contents of multiple files based on specified extensions and filtering criteria. Developed to aggregate files for use as context in Large Language Model (LLM) queries, concat
is a useful tool for developers and system administrators seeking to organize and consolidate project files efficiently.
concat
facilitates the combination of file contents by providing filtering and concatenation options. Whether preparing code snippets for LLMs, consolidating logs, or managing files within larger projects, this tool offers a straightforward and customizable approach.
- Extension Filtering: Select files by one or multiple extensions (e.g.,
.py
,.js
,.txt
). - Recursive Search: Traverse directories recursively or limit the search to the top level.
- Exclusion Patterns: Exclude specific files or directories using patterns or wildcards.
- Hidden Files Handling: Option to include or exclude hidden files and directories.
- Python Cache Cleanup: Automatically remove
__pycache__
directories and.pyc
files. - Directory Tree Overview: Generate a tree structure of the target directory in the output.
- Verbose and Debug Modes: Enable logging and execution tracing for troubleshooting.
- Binary File Exclusion: Automatically skip unreadable or binary files if desired.
- Customizable Output: Specify output file names and directories.
- LLM-Friendly Concatenation: Organize file aggregation for compatibility with Large Language Models.
Integrate the concat
function into your Zsh environment by selecting one of the following methods based on your preference and setup requirements.
Suitable for users managing multiple custom Zsh functions.
-
Create a Directory for Custom Functions
Ensure a dedicated directory for your custom Zsh functions exists. If not, create one using the following command:
mkdir -p ~/.zsh_functions
-
Add the
concat.zsh
FileMove the
concat.zsh
file into the~/.zsh_functions
directory:mv /path/to/concat.zsh ~/.zsh_functions/concat.zsh
Replace
/path/to/concat.zsh
with the actual path to yourconcat.zsh
file. -
Configure Your Zsh Profile
Open your
~/.zshrc
file in your preferred text editor:nano ~/.zshrc
Append the following script to source all
.zsh
files within the~/.zsh_functions
directory:# Source all custom Zsh functions from ~/.zsh_functions if [[ -d "$HOME/.zsh_functions" ]]; then for func_file in "$HOME/.zsh_functions"/*.zsh; do if [[ -f "$func_file" ]]; then if ! source "$func_file" 2>/dev/null; then echo "Error: Failed to source $(basename "$func_file"). Please verify the file's path and integrity." >&2 fi else echo "Warning: '$func_file' is not a regular file or does not exist." >&2 fi done else echo "Error: Directory '$HOME/.zsh_functions' does not exist. Please create it and add your function files." >&2 fi
-
Reload Your Zsh Configuration
Apply the changes by sourcing your updated
~/.zshrc
:source ~/.zshrc
Recommended for users who prefer to source the concat
function individually. Creating a directory for functions is optional but recommended for better organization.
-
Create a Directory for Custom Functions (Optional but Recommended)
While optional, organizing your custom functions in a dedicated directory enhances maintainability. Create one if you haven't already:
mkdir -p ~/.zsh_functions
-
Add the
concat.zsh
FileMove the
concat.zsh
file into the~/.zsh_functions
directory:mv /path/to/concat.zsh ~/.zsh_functions/concat.zsh
Replace
/path/to/concat.zsh
with the actual path to yourconcat.zsh
file. -
Configure Your Zsh Profile
Open your
~/.zshrc
file in your preferred text editor:nano ~/.zshrc
Append the following script to source the
concat.zsh
function directly:# Source the concat function CONCAT_FUNC_PATH="$HOME/.zsh_functions/concat.zsh" if [[ -f "$CONCAT_FUNC_PATH" ]]; then if ! source "$CONCAT_FUNC_PATH" 2>/dev/null; then echo "Error: Failed to source 'concat.zsh'. Please verify the file's path and integrity." >&2 fi else echo "Error: 'concat.zsh' not found in '$HOME/.zsh_functions/'. Please ensure the file exists." >&2 fi
-
Reload Your Zsh Configuration
Apply the changes by sourcing your updated
~/.zshrc
:source ~/.zshrc
Note: Only error messages will appear if issues are encountered during sourcing.
After installation, you can concatenate files by specifying the desired extensions. For example, to concatenate all Python files in the current directory:
concat .py
The concat
function offers various options to customize how files are merged. Below are detailed instructions on its usage.
concat [extensions] [OPTIONS]
Arguments:
[extensions]
: Specify a single extension (e.g.,.py
) or a comma-separated list of extensions (e.g.,.py,.js
ortxt,md
). If omitted, all file extensions are included.
Option | Short | Description |
---|---|---|
--output-file <file> |
-f |
Name or path for the concatenated output file. Defaults to concatOutput.txt . |
--output-dir <dir> |
-d |
Directory where the output file will be saved. Defaults to the current directory. |
--input-dir <dir> |
-i |
Directory to search for files. Can be relative or absolute. Defaults to the current directory. |
--exclude <patterns> |
-e |
Comma-separated list of file or directory paths/patterns to exclude. Supports wildcards. |
--exclude-extensions <exts> |
-X |
Comma-separated list of file extensions to exclude (e.g., txt,log ). Extensions can be prefixed with . or provided as plain text. |
--recursive |
-r |
Recursively search subdirectories. Default is true . |
--no-recursive |
Disable recursive search. | |
--title |
-t |
Include a title line at the start of the output file. Default is true . |
--no-title |
Exclude the title line from the output file. | |
--verbose |
-v |
Enable verbose output, showing matched files and other details. |
--case-sensitive-extensions |
-c |
Match file extensions case-sensitively. Default is false . |
--case-sensitive-excludes |
-s |
Match exclude patterns case-sensitively. Default is false . |
--case-sensitive-all |
-a |
Enable case-sensitive matching for both extensions and exclude patterns, overriding the two options above. Default is false . |
--tree |
-T |
Include a tree representation of directories in the output. Default is true . |
--no-tree |
Disable the tree representation in the output (overrides --tree ). |
|
--include-hidden |
-H |
Include hidden files and directories in the search. Default is false . |
--no-include-hidden |
Exclude hidden files and directories from the search. | |
--delPyCache |
-p |
Automatically delete __pycache__ folders and .pyc files. Default is true . |
--no-delPyCache |
Disable automatic deletion of __pycache__ and .pyc files. |
|
--exclude-binary |
-B |
Automatically exclude unreadable or binary files from concatenation. Default is true . |
--no-exclude-binary |
Do not exclude unreadable or binary files (overrides --exclude-binary ). |
|
--debug |
-x |
Enable debug mode with verbose execution tracing. |
--help |
-h |
Display the help message and exit. |
-
Concatenate Python Files, Exclude
__init__.py
, and Specify Output Fileconcat .py --output-file allPython.txt --exclude __init__.py
-
Concatenate Python and JavaScript Files Recursively with Verbose Output
concat py,js -r -v
-
Concatenate Files Without Adding a Title, Specify Input and Output Directories
concat --no-title --input-dir ~/project --output-dir ~/Desktop
-
Exclude Specific Extensions and Include Hidden Files
concat txt,md -X log,tmp -H
-
Enable Debug Mode for Troubleshooting
concat .sh --debug
-
Disable Automatic Exclusion of Binary Files
concat .sh --no-exclude-binary
Contributions are welcome! Whether you're reporting a bug, suggesting a feature, or submitting a pull request, your input helps improve concat
.
-
Fork the Repository
Navigate to the repository page and click the "Fork" button to create your own copy.
-
Clone Your Fork
git clone https://github.com/your-username/concat-zsh.git cd concat-zsh
-
Create a Feature Branch
git checkout -b feature/YourFeatureName
-
Make Your Changes
Ensure your code adheres to the project's coding standards and includes necessary documentation.
-
Commit Your Changes
git commit -m "Add feature: YourFeatureName"
-
Push to Your Fork
git push origin feature/YourFeatureName
-
Open a Pull Request
Navigate to the original repository and click "New Pull Request." Provide a clear description of your changes and their purpose.
If you encounter any issues or have feature requests, please open an issue in the repository's Issues section. Include detailed information to help maintainers address the problem effectively.
For support, please open an issue in the Issues section of the repository.
This project is licensed under the GNU General Public License v3.0. You are free to use, modify, and distribute this software in accordance with the terms of the license.