#!/usr/bin/env bash #----------------------------------------------------------------------------- # █▀▀ ▄▀█ █▀ ▀█▀ █▀▀ █ █ █▀▀ █▀ █░█ █▀▀ █▀█ █▄▄ █▀█ █▀ █▀▀ # █▀ █▀█ ▄█ █ █▀ █ █▄▄ ██▄ ▄█ ▀▄▀ ██▄ █▀▄ █▄█ █▄█ ▄█ ██▄ # # Usage: ffv [path file or folder] # # Arguments: --help : prints usage info # -h : prints usage info # # Description: Bash script which is a combination of 'mkdir' and 'touch'. # It can create directory structures and files simultaneously # and lists the created objects using eza, lsd, or ls. # # Dependencies: bash, eza (optional), lsd (optional) # # Examples: - Single file: # ffv file # - Single directory: # ffv dir/ # - Multiple files: # ffv file1 file2 file3 # - Multiple directories: # ffv dir1/ dir2/ dir3/ # - File in a directory # ffv dir/file # - Directory in a directory # ffv dir1/dir2/ # - Multiple files in multiple directories # ffv dir1/dir2/file1 dir3/file2 # - If your shell supports brace expansion e.g bash, zsh, fish # ffv dir1/{dir2/{file1,file2}.txt,dir3/file3.txt} #----------------------------------------------------------------------------- if [[ $# -eq 0 ]]; then echo "No arguments provided" echo "Usage: ffv [path file or folder]" echo "For more information, run: ffv --help" exit 1 fi if [[ "$1" == "--help" || "$1" == "-h" ]]; then echo "Usage: ffv [path file or folder]" echo "Examples: - Single file: ffv file - Single directory: ffv dir/ - Multiple files: ffv file1 file2 file3 - Multiple directories: ffv dir1/ dir2/ dir3/ - File in a directory ffv dir/file - Directory in a directory ffv dir1/dir2/ - Multiple files in multiple directories ffv dir1/dir2/file1 dir3/file2 - If your shell supports brace expansion e.g bash, zsh, fish ffv dir1/{dir2/{file1,file2}.txt,dir3/file3.txt}" exit 0 fi # Create directory structures and files for path in "$@"; do if [[ "$path" == */ ]]; then mkdir -p "$path" fi parent_dir=$(dirname "$path") if [[ -n "$parent_dir" ]] && [[ ! -d "$parent_dir" ]]; then mkdir -p "$parent_dir" fi touch "$path" done # Get the created files and folder names and print them unique_names=() for arg in "$@"; do name="${arg%%/*}" if [ -n "$name" ]; then if [[ ! " ${unique_names[*]} " =~ $name ]]; then unique_names+=("$name") fi fi done if command -v eza &>/dev/null; then eza -aU --no-user --no-filesize --no-permissions --tree --icons \ --group-directories-first "${unique_names[@]}" elif command -v lsd &>/dev/null; then lsd -al --tree --icon=always --group-directories-first "${unique_names[@]}" else ls -ARl --color=always "${unique_names[@]}" fi