私はfindコマンドを使用して、ディレクトリといくつかのサブディレクトリにあるソースファイルのリストを生成しようとしています。例:
/Source_Files
/dontexclude
dontexclude.h
dontexclude.c
/exclude
exclude.c
exclude.h
main.c
test.c
test.h
「.c」と「.h」で終わるファイルのリストを望み、/excludeサブディレクトリの内容を除外したいと思います。
find -name '*.c' -o -name '*.h' -o -path '*/exclude' -prune
次の出力を生成します。
./test.h
./exclude
./test.c
./main.c
./dontexclude/dontexclude.c
./dontexclude/dontexclude.h
find
"./exclude"なしで上記のリストをどのように生成できますか?
答え1
find . -name excludeme -prune -o \
\( -name '*.c' -o -name '*.h' \) -print
覚えてくださいそして(暗黙的に)優先順位があります。または(-o
)。 (あなたも確認できます-name '*.[ch]'
)
答え2
最も簡単な変更は、-prune
(このディレクトリをもう一度見ないでください)を-prune -false
(このディレクトリをもう一度見ないでください。一致しません)に置き換えることです。
答え3
いくつかの追加のファイルシステム操作を犠牲にして、検索を純粋なファイルに制限します。exclude
ファイルではないため、ディレクトリは除外されます。
find . \( -name '*.c' -o -name '*.h' -o -path '*/exclude' -prune \) -type f
答え4
このコマンドは要求された内容を返します。
find . \( -name '*.c' -o -name '*.h' \) -a \! \( -path './exclude/*' \)