findコマンドの出力からクリーンアップディレクトリ名を削除します。

findコマンドの出力からクリーンアップディレクトリ名を削除します。

私は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/*' \)

関連情報