Одно заслуживающее внимания отличие — доступные репозитории. Вы не можете использовать RPM Fusion или EPEL с сервером Fedora. Это ограничивает доступные пакеты
.Ваша команда почти верна. Исправляем:
find. \( -name node_modules -o -path./common \) -prune -o -name '*.js' -print
Это удаляет все, что называется node_modules
или находится в ./common
. Обратите внимание, что имя пути, используемое с -path
, представляет собой путь с путем поиска верхнего уровня -в качестве начального, и поэтому в этом случае он должен начинаться с .
.
Используемый вами -false
не нужен. Это было бы необходимо, если бы node_modules
или ./common
также соответствовали вашему тесту -name
после -o
. Это также, когда вы, возможно, захотите использовать -type d
, что вам теперь не нужно делать.
Тестирование:
$ tree
.
|-- common
| `-- file.js
|-- dir
| |-- common
| | `-- file.js
| |-- file.js
| `-- node_modules
| `-- file.js
`-- node_modules
`-- file.js
5 directories, 5 files
$ find. \( -name node_modules -o -path./common \) -prune -o -name '*.js' -print
./dir/file.js
./dir/common/file.js
Файл ./dir/common/file.js
найден, так как он находится в не -удаленном каталоге(common
удаляется только в том случае, если он находится непосредственно под текущим каталогом ).
В другом месте кажется, что все, что вам нужно сделать, это посмотреть, есть ли какие-либо файлы, соответствующие *.js
в не -обрезанных каталогах. Вы можете сделать это эффективно с помощью
if find. \( -name node_modules -o -path./common \) -prune -o -name '*.js' -exec echo. \; | grep -q.
then
echo there are JS files
else
echo there are no JS files
fi
Здесь я вывожу одну точку (может быть любым символом )всякий раз, когда я нахожу файл, и я использую grep -q.
для обнаружения любого вывода из find
. Когда что-то будет найдено, grep
завершится с нулевым статусом выхода -, сигнализируя об "успехе", и оператор if
выполнит первую ветвь. Команда find
завершится, как только она попытается записать еще одну точку в канал, который grep
больше не прослушивает.
Команда, которую я выбрал после просмотра и тестирования некоторых из приведенных выше ответов, такова:
find. \( -name node_modules -o -path./common \) -prune -o -name '*.js' -print
И причина, по которой мне пришлось сохранить аргумент -print
, заключается в том, что я обнаружил, что вывод, который я получил при запуске без -print
, показывал некоторые папки в виде вывода, подобного этому:
./common
./lib/trader-sdk/node_modules
./lib/is-ticker-symbol/node_modules
./apps/cron-app/node_modules
./services/templating-service/node_modules
./services/api-service/node_modules
./services/trading-services/node_modules
./services/sentiment-service/node_modules
Но когда я добавил аргумент -print
, на выходе ничего не было, что и ожидалось в данной ситуации.
Бонус :Это последний вариант использования, базовый скрипт, который проверит мой репозиторий TypeScript mono -, чтобы убедиться, что никто -не пытается объединить какие-либо файлы сборки .js
в мастер.
#!/bin/bash
jsFiles=$(find. \( -name node_modules -o -path./common \) -prune -o -name '*.js' -print)
if [ -z "$jsFiles" ]
then
echo "No JS files found, free to proceed"
exit 0
else
echo "JS files found, unable to proceed"
exit 1
fi
Если вы используете путь -, используйте полностью объявленный путь, например ./common
, или используйте -name
для поиска в любом месте найденного дерева.
Эта команда работала для меня как тест.
find. -type d \( -name common -o -name node_modules \) -prune -false -o -name '*.js'