1. ホーム
  2. regex

[解決済み】shでfindの'-prune'オプションを使用するには?

2022-04-01 13:39:52

質問

の例がよくわからないのですが。 man find どなたか、例題や解説をお願いします。正規表現を組み合わせてもいいのでしょうか?


より詳細な質問はこのようなものです。

シェルスクリプトを書きましょう。 changeall のようなインターフェイスを持ち、そのインターフェイスは changeall [-r|-R] "string1" "string2" . の接尾辞を持つすべてのファイルを検索します。 .h , .C , .cc または .cpp を変更し string1string2 . -r は、現在のディレクトリにのみ留まるか、サブディレクトリを含むかを指定するオプションです。

注意

  1. 非再帰の場合。 ls は使用できないので findsed .
  2. 試してみた find -depth が、サポートされていませんでした。そのため、私は -prune の例がよくわからなかったのです。 man find .

EDIT2: 私は課題をやっていたので、自分で仕上げたいので、あまり詳しく質問していませんでした。私はすでにそれをやって、それを提出したので、今私は全体の質問を述べることができます。また、私は何とかして -prune しかし、いずれにせよ、学びたいと思います。

解決方法は?

私が紛らわしいと思ったのは -prune は、アクションであること(たとえば -print のような)テストではありません。 -name ). これは "ToDo"リストを変更するものです。 を返しますが、常に真 .

を使用する一般的なパターンです。 -prune はこうです。

find [path] [conditions to prune] -prune -o \
            [your usual conditions] [actions to perform]

このような場合、ほとんどの場合 -o (論理和)の直後に -prune というのも、このテストの最初の部分(~を含む)が -prune を返します。 false は、実際に欲しいもの(つまり、あなたが しない を削除したい)。

以下はその例です。

find . -name .snapshot -prune -o -name '*.foo' -print

これは、".snapshot" ディレクトリの下にない "*.foo" ファイルを見つけます。この例では -name .snapshot が構成されます。 [conditions to prune] であり、かつ -name '*.foo' -print[your usual conditions][actions to perform] .

重要なお知らせ :

  1. 結果を表示したいだけなら、通常は -print アクションを使用します。あなたは一般的に しない を使用する場合、そのようなことはしたくありません。 -prune .

    findのデフォルトの動作は、"and"です。 全体 式に -print 以外のアクションがない場合は -prune (皮肉にも)最後に つまり、これを書くと

     find . -name .snapshot -prune -o -name '*.foo'              # DON'T DO THIS
    
    

    は、こう書くことと同じです。

     find . \( -name .snapshot -prune -o -name '*.foo' \) -print # DON'T DO THIS
    
    

    というのは、刈り込み対象のディレクトリの名前も出力してしまうからで、これは通常望むところではありません。代わりに、明示的に -print アクションを実行します。

     find . -name .snapshot -prune -o -name '*.foo' -print       # DO THIS
    
    
  2. もし、quot;通常条件" が、prune 条件にもマッチするファイルに偶然マッチした場合、それらのファイルには ではない が出力に含まれます。これを修正する方法は -type d の述語をプルーン条件に追加します。

    例えば、ディレクトリの先頭が .git (という名前のものを削除すればよいのです(これはたしかに、やや作為的なものです。 まさに .git のようなファイルを含むすべてのファイルを見たいと考えていました。 .gitignore . こうしてみてはどうだろう。

    find . -name '.git*' -prune -o -type f -print               # DON'T DO THIS
    
    

    この場合 ない インクルード .gitignore を出力します。以下は修正版です。

    find . -name '.git*' -type d -prune -o -type f -print       # DO THIS
    
    

おまけのヒント: GNUバージョンの find , の texinfo ページを参照してください。 find には、そのマニュアルページよりも詳細な説明があります (ほとんどの GNU ユーティリティに言えることですが)。