Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Default directory to list
- dir="."
- # Array to hold directories to ignore
- ignore_dirs=(".git" ".vscode" "node_modules" "coverage" "dist" "docker" "vendor" "logs" "volume" "build" "var")
- # Array to hold file names to ignore
- ignore_files=("package-lock.json" "composer.lock" ".env" "config/bundles.php")
- dirs_only=false
- specific_files=()
- # Function to display script usage
- usage() {
- echo "Usage: $0 [-i <dir_to_ignore>] [-f <file_to_ignore>] [-s <specific_file>] [-d] [-h]"
- echo "Options:"
- echo " -i Specify a directory to ignore (can be used multiple times)"
- echo " -f Specify a file name to ignore (can be used multiple times)"
- echo " -s Specify a file to list contents of (can be used multiple times)"
- echo " -d Only list directories"
- echo " -h Display this help message and exit"
- }
- # Parsing command line options
- while getopts ":i:f:s:dh" opt; do
- case $opt in
- i) ignore_dirs+=("$OPTARG") ;;
- f) ignore_files+=("$OPTARG") ;;
- s) specific_files+=("$OPTARG") ;;
- d) dirs_only=true ;;
- h) usage; exit 0 ;;
- \?) echo "Invalid option: -$OPTARG" >&2; usage; exit 1 ;;
- esac
- done
- # Check if we should ignore/omit a directory or file
- should_ignore() {
- for ignore in "${ignore_dirs[@]}"; do
- [[ $1 == *"$ignore"* ]] && return 0
- done
- for ignore_file in "${ignore_files[@]}"; do
- [[ $(basename "$1") == "$ignore_file" ]] && return 0
- done
- [[ $(basename "$1") == "context.txt" ]] && return 0
- [[ $(file --mime-encoding -b "$1") == "binary" ]] && return 0
- return 1
- }
- # Function to list file contents in XML format
- list_file_contents() {
- local file_path="$1"
- echo " <document index=\"$document_index\" type=\"file\">"
- echo " <source>$file_path</source>"
- echo " <document_content><![CDATA["
- cat "$file_path"
- echo ""
- echo "]]></document_content>"
- echo " </document>"
- ((document_index++))
- }
- # Function to generate tree structure using the 'tree' command
- generate_tree_structure() {
- local current_dir=$1
- local ignore_pattern=$(IFS='|'; echo "${ignore_dirs[*]}")
- if [ "$dirs_only" = true ]; then
- tree -d -I "$ignore_pattern" "$current_dir"
- else
- tree -I "$ignore_pattern" "$current_dir"
- fi
- }
- # Main function to list directories and files
- list_dir_contents() {
- local current_dir=$1
- echo "<documents>"
- # Output tree structure
- echo " <document index=\"0\" type=\"directory_structure\">"
- echo " <source>tree_structure</source>"
- echo " <document_content><![CDATA["
- echo "$current_dir"
- generate_tree_structure "$current_dir"
- echo "]]></document_content>"
- echo " </document>"
- # If we only want to list directories, return
- [ "$dirs_only" = true ] && echo "</documents>" && return
- # If specific files are provided, only list their contents
- if [ ${#specific_files[@]} -gt 0 ]; then
- for file in "${specific_files[@]}"; do
- if [ -f "$file" ] && ! should_ignore "$file"; then
- list_file_contents "$file"
- fi
- done
- echo "</documents>"
- return
- fi
- # Loop through all files
- while IFS= read -r -d $'\0' file; do
- if [ -f "$file" ] && ! should_ignore "$file"; then
- list_file_contents "$file"
- fi
- done < <(find "$current_dir" -type f -print0)
- echo "</documents>"
- }
- # Initialize document index
- document_index=1
- # Main execution
- list_dir_contents "$dir"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement