Linux Командная строка - перечислить все каталоги, содержащие файлы. js, и скопировать каталоги и их содержимое в новую папку - PullRequest
4 голосов
/ 26 мая 2020

Вот уже имеющийся у меня код, который находит и перечисляет все каталоги, содержащие файлы. js (исключая каталог node_modules).

find . -name '*.js*' -printf "%h\n" | sort -u | grep -v node_modules

Как видите, перечислить эти каталоги не проблема. Однако вместо того, чтобы перечислять каталоги, я хотел бы скопировать их (и их содержимое) в новую папку, желательно все в одной строке без запуска какого-либо скрипта.

Любая помощь будет очень признательна!

1 Ответ

2 голосов
/ 26 мая 2020

Самый безопасный способ сделать это - обработать список каталогов, используя 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")
...