Here is the code I already have that finds and lists all directories containing .js files (excluding the node_modules directory).
find . -name '*.js*' -printf "%hn" | sort -u | grep -v node_modules
As you can see, listing those directories is no problem. However, rather than list the directories, I would like to copy them (and their contents) to a new folder, preferably all in one line without running any kind of script.
Any help would be much appreciated!
The safest way to do this is to process the list of directories using NULL as the delimiter so that directories with spaces (and other odd characters) are handled correctly.
echo if the output looks correct.
find "/path/to/tld" -path "*node_modules*" -prune -o -name "*.js" -printf "%h" | sort -uz | xargs -0 -I _ echo cp -a _ "/path/to/new/dir"
This requires Bash 4 for the associative array which will filter out duplicates.
#!/bin/bash tld="/path/to/top/level/dir" newdir="/path/to/new/dir" unset dirHash; declare -A dirHash while read -r -d $'' dir; do (( ! dirHash["$dir"]++ )) && echo cp -a "$dir" "$newdir" done < <(find "$tld" -path "*node_modules*" -prune -o -name "*.js" -printf "%h")