68user's page 掲示板

Prev< No. 4837> Next  [最新発言に戻る] [過去ログ一覧]
No. 4837 # 68user 2007/09/29 (土) 14:20:52
>>4836 べた
> find /home/DATA/backup -name '*.csv' -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune -o -print
> と実行すると、
> カレントディレクトリと、「*.csv」以外のファイルが表示されます。
この結果がすでにマズいんですよね?

前回のわたしの回答
>>4763 68user
は的外れだったような気がします。最終的には以下のようになるのではないかと思います。
    % find /home/DATA/backup -name '*.csv' -mtime +30 -exec ls -l {} \; -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune

構造としては
    ・[ファイル名が *.csv] AND [mtime が +30] AND [-exec ls -l]
        OR
    ・[ファイル名が everyday] AND [-prune]
        OR
    ・[ファイル名が monthly] AND [-prune]
        OR
        (略)
となります。

ただし -exec や -prune は常に真で、コマンドを実行する・ディレクトリを下降しない
という副作用を発生させるのが主目的ですので、より平易に書くと
    ・[ファイル名が *.csv] AND [mtime が +30] なら [-exec ls -l] を実行
        OR
    ・[ファイル名が everyday] なら [-prune] で下降抑止
        OR
    ・[ファイル名が monthly] なら [-prune] で下降抑止
        OR
        (略)
となります。なお、ここでの OR は、左辺が真なら右辺は評価しない、
という意味です。また、OR の各要素の順序を入れ替えても、このケース
では問題ありません (*.csv と everyday が両方真になることはないので)。

典型的な -prune の使い方をまとめると以下のようになると考えます。
      - 特定のディレクトリ以外について何か (-print) を行う
              ⇒ find . -name hoge -prune -o -print
      - 特定のパターンのファイルに何か (-ls) を行うが、特定ディレクトリ以下は除外する
              ⇒ find . -name \*.csv -ls -o -name hoge -prune
      - 特定のパターンのファイルに何か (-print) を行うが、特定ディレクトリだけは
          除外する。ただし特定のパターンにも特定のディレクトリにも一致しない場合は、
          別の何かを行う (-ls)。
              ⇒ find . -name \*.csv -print -o -name hoge -prune -o -ls

Prev< No. 4837> Next  [最新発言に戻る] [過去ログ一覧]