+#!/usr/bin/env bash
+
+filter_no_dots() {
+ # Desc: Filters stdin lines for paths with basenames that are not dotfiles
+ # Usage: printf "foo\n" | filter_no_dots [path]
+ # Input: stdin (consumes)
+ # args
+ # Output: stdout (only outputs lines if basename is not a dotfile)
+ # Version: 0.0.1
+ # Depends: GNU bash (v5.1.16)
+
+ local input_stdin input_psarg buffer re output;
+
+ # Store stdin
+ if [[ -p /dev/stdin ]]; then
+ input_stdin="$(cat -)";
+ fi;
+
+ # Store arguments
+ if [[ $# -gt 0 ]]; then
+ input_psarg="$*";
+ fi;
+
+ # Combine as buffer array elements
+ ## Read in stdin
+ if [[ -n $input_stdin ]]; then
+ while read -r line; do
+ buffer+=("$line");
+ done < <(printf "%s\n" "$input_stdin");
+ fi;
+ ## Read in positional arguments
+ if [[ -n $input_psarg ]]; then
+ for arg in "$@"; do
+ buffer+=("$arg");
+ done;
+ fi;
+
+ # Form output array
+ re="^\."; # first char is a dot
+ while read -r line; do
+ # Get path basename
+ file_name="$(basename "$line")";
+ # Add path to output if basename not a dotfile
+ if [[ ! "$file_name" =~ $re ]]; then
+ output+=("$line");
+ else
+ continue;
+ fi;
+ done < <( printf "%s\n" "${buffer[@]}" );
+
+ # Print output array to stdout
+ printf "%s\n" "${output[@]}";
+}; # Filters stdin lines for paths with basenames that are not dotfiles
+
+# Test
+printf "foo\n.bar\nbaz\n" | filter_no_dots "$HOME/.local" "$HOME/"