コマンドから複数のパスを除外する必要がありますfind
。たとえば、
find "$(pwd)" -not \( \
-path "*/.git"\
-o -path "*/.git/*"\
-o -path "*/.vscode"\
-o -path "*/.vscode/*"\
-o -path "*/node_modules"\
-o -path "*/node_modules/*"\
-o -path "*/Image"\
-o -path "*/Image/*"\
-o -path "*/Rendered"\
-o -path "*/Rendered/*"\
-o -path "*/iNotebook"\
-o -path "*/iNotebook/*"\
-o -path "*/GeneratedTest"\
-o -path "*/GeneratedTest/*"\
-o -path "*/GeneratedOutput"\
-o -path "*/GeneratedOutput/*"\
-o -path "*/*_files" \) -type d
しかし、コマンドラインにすべてのパスを一覧表示するのではなく、テキストファイルからこれらのパスを読みたいのです。どうすればいいですか?
ベストアンサー1
後で呼び出しに使用する配列を設定しますfind
。次のスクリプトは、標準入力から改行で区切られたパスパターンを読み取り、次を呼び出しますfind
。
#!/bin/sh
set --
while IFS= read -r path; do
set -- "$@" -o -path "$path"
done
shift # remove initial "-o" from $@
find . -type d ! '(' "$@" ')'
あなたはこれを実行します
./script.sh <paths.txt
どこpaths.txt
のように見えますか?
*/.git
*/.git/*
*/.vscode
*/.vscode/*
*/node_modules
*/node_modules/*
*/Image
*/Image/*
*/Rendered
*/Rendered/*
*/iNotebook
*/iNotebook/*
*/GeneratedTest
*/GeneratedTest/*
*/GeneratedOutput
*/GeneratedOutput/*
*/*_files
または、パスパターンはデフォルトではディレクトリ名なので、次のようになります。
#!/bin/sh
set --
while IFS= read -r dirname; do
set -- "$@" -o '(' -name "$dirname" -prune ')'
done
shift # remove initial "-o" from $@
find . -type d ! '(' "$@" ')'
スキーマファイルには以下が含まれます。
.git
.vscode
node_modules
Image
Rendered
iNotebook
GeneratedTest
GeneratedOutput
*_files
このコードバリアントはfind
ファイルのパターンと一致するディレクトリに降りることを停止しますが、最初のスクリプト(およびコード)はそのパスに-path
興味がないかどうかにかかわらず、除外されたディレクトリ内のすべてのアイテムに対してパターンをテストします。次のいずれかに興味があります。