Посмотреть, существуют ли какие-либо файлы с заданным расширением в структуре папок, за исключением нескольких каталогов

Одно заслуживающее внимания отличие — доступные репозитории. Вы не можете использовать RPM Fusion или EPEL с сервером Fedora. Это ограничивает доступные пакеты

.
2
12.03.2021, 18:56
3 ответа

Ваша команда почти верна. Исправляем:

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больше не прослушивает.

1
18.03.2021, 22:25

Команда, которую я выбрал после просмотра и тестирования некоторых из приведенных выше ответов, такова:

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
0
18.03.2021, 22:25

Если вы используете путь -, используйте полностью объявленный путь, например ./common, или используйте -nameдля поиска в любом месте найденного дерева.

Эта команда работала для меня как тест.

find. -type d \( -name common -o -name node_modules \) -prune -false -o -name '*.js'
0
18.03.2021, 22:25

Теги

Похожие вопросы