ファイルのあるディレクトリ./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
は、ほとんどの場合、誰かがスペースを含むファイル名(またはさらに悪いことに改行)を作成した場合に発生するのを待つ問題です。