Быстро найти и распечатать все файлы в папке, рекурсивно, исключая их из `node_modules` и `.git`

Рассмотрим следующую структуру папок, начиная с некоторой корневой папки

/root/
/root/.git
/root/node_modules
/root/A/
/root/A/stuff1/
/root/A/stuff2/
/root/A/node_modules/
/root/B/
/root/A/stuff1/
/root/A/stuff2/
/root/B/node_modules/
...

Теперь я нахожусь в /root, и я хотел бы найти в нем все свои собственные файлы. У меня есть небольшое количество собственных файлов и огромное количество файлов внутри node_modules и .git.

Из-за этого перемещение node_modules и его фильтрация недопустимы, так как требуется слишком много времени. Я хочу, чтобы команда никогда не входила в папку node_modules или .git.

Ответ 1

Для исключения файлов только из папки поиска:

find . -not \( -path './.git' -prune \) -not \( -path './node_modules' -prune \) -type f

Если вы хотите исключить определенные пути, находящиеся во вложенных папках, вы можете сделать это с помощью подстановочного символа *.

Предположим, что у вас есть node_modules внутри stuff1 и stuff2, а также dist и lib папок:

find . -not \( -path './.git' -prune \) -not \( -path './node_modules' -prune \) -not \( -path './*/node_modules' -prune \) -not \( -path './*/dist' -prune \)  -not \( -path './*/lib' -prune \) -type f

Протестировано в Windows с помощью git bash 1.9.5

Похоже, что он не работает должным образом в Windows, когда передается фильтр типа -name '*.js'. Обходной путь может заключаться в том, чтобы вместо -name использовать -name и pipe вместо grep.

Престижность @Даниэль К. Собрал