除外ファイルにリストされているパスを検索するコマンド

除外ファイルにリストされているパスを検索するコマンド

コマンドから複数のパスを除外する必要があります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興味がないかどうかにかかわらず、除外されたディレクトリ内のすべてのアイテムに対してパターンをテストします。次のいずれかに興味があります。

おすすめ記事