ファイルのあるディレクトリ./srcがあります。にあるファイルを.c除いて、その中のすべてのファイルを抽出したいと思います。私はの亜種を試しました.c./src/test
find ./src -name "*.c" -and -not -name ./src/test
(ここからインスピレーションを得た)が、成功したものはありません。
私は何が間違っているのですか?
使えますgrepか?
find ./src -name \*.c | grep -v ./src/test
grep -vパスに改行がないと仮定して、ポストフィルターを使用します(スペースは問題ありません)。
find ./src -name "*.c" | grep -v '/src/test/'
あなたの問題は-name、パスの最後の要素だけを見るということだと思います。そのため、-nameスラッシュが含まれていると、単に機能しません。
お使いのバージョンがfindサポートしている場合は-path、代わりにを使用すると-name機能する可能性があります。
find ./src -name "*.c" -and -not -path './src/test/*'
に変更されたオペランドに注意してください-path。
-regexパス全体(-name現在のディレクトリのファイル名のみと一致)を一致-pruneさせ、ツリーのその部分を削除する必要があります。
find ./src -regex '^./src/test$' -prune -o -name '*.c' -print0 | xargs -0 ....
findなし-print0は、ほとんどの場合、誰かがスペースを含むファイル名(またはさらに悪いことに改行)を作成した場合に発生するのを待つ問題です。