特定の拡張子を持つファイルがフォルダ構造に存在することを確認してください(一部のディレクトリを除く)。

特定の拡張子を持つファイルがフォルダ構造に存在することを確認してください(一部のディレクトリを除く)。

Typescript Mono-repoプロジェクトのリンターとして機能するCIビルドで使用できるスクリプトを構成しようとしています。

.js私が達成したいのは、プロジェクト/パッケージリポジトリにファイルがあることを確認することです。ただし、node_modulesそのファイルがあるフォルダとcommonフォルダ、およびすべてのサブディレクトリとファイルは避けることです。

ファイル構造はこれです

project/
├── apps/
│   ├── app1
├── common/
│   ├── folder1
│   ├── folder1
│   ├── etc
├── lib/
│   ├── lib1
├── services/
│   ├── service1

services,lib,appsすべてのnpmプロジェクトのサブディレクトリです。

これまでに試したさまざまな試みのいくつかは次のとおりです。

find . \( ! -name node_modules \) -o \( ! -path common -prune \) -name "*.js" -print

しかし、他のホワイトリストフォルダにダミーファイルを作成しても.js何も返さないようです。/project

これはテストファイルを印刷するため、最も近いようですが、ファイルも見つかりましたが、commonブラックリストに追加する必要があります。

find . -type d \( -path common -o -name node_modules \) -prune -false -o -name '*.js'

この実行の出力:

./test.js
./common/temp/pnpmfile.js
./common/temp/pnpm-store/2/registry.npmjs.org/ipaddr.js
./common/config/rush/pnpmfile.js
./common/scripts/install-run.js
./common/scripts/install-run-rushx.js
./common/scripts/install-run-rush.js
./services/test.js

このスクリプトで私が望む全体的な目標は、ファイルがホワイトリストディレクトリにない場合は0を終了し、ファイルが.jsブラックリストディレクトリの外にある場合は1を終了することです。.js

私は初心者であり、シェルコマンドの経験がないので、助けてくれてありがとう。よろしくお願いします!

答え1

あなたの注文はほぼ正確です。編集してください:

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

答え2

-pathを使用している場合は、見つかったツリーのどの場所と一致するか./commonなど、完全に宣言されたパスを使用してください。-name

この命令は私にとってテストです。

find . -type d \( -name common -o -name node_modules \) -prune -false -o -name '*.js'

答え3

上記の答えのいくつかを見てテストした後、最後に使用したコマンドは次のとおりです。

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

しかし、argを追加すると、-print出力は何もなりません。これはこの場合の期待される結果です。

.jsボーナス:最後のユースケースは次のとおりです。 TypeScriptモノリポジトリを調べて、ビルドファイルをマスターにマージしたい人がいないことを確認するデフォルトのスクリプト。

#!/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

関連情報