Самый безопасный способ сделать это - обработать список каталогов, используя NULL в качестве разделителя, чтобы каталоги с пробелами (и другими нечетными символами) обрабатывались правильно.
Удалите echo
, если вывод выглядит правильно.
«1-строчный»
find "/path/to/tld" -path "*node_modules*" -prune -o -name "*.js" -printf "%h\0" | \
sort -uz | xargs -0 -I _ echo cp -a _ "/path/to/new/dir"
Bash Скрипт
Это требует Bash 4 для ассоциативного массива, который отфильтрует дубликаты.
#!/bin/bash
tld="/path/to/top/level/dir"
newdir="/path/to/new/dir"
unset dirHash;
declare -A dirHash
while read -r -d $'\0' dir; do
(( ! dirHash["$dir"]++ )) && echo cp -a "$dir" "$newdir"
done < <(find "$tld" -path "*node_modules*" -prune -o -name "*.js" -printf "%h\0")