これは私の検索コマンドです。
find -mtime -$a | xargs zgrep -il ''$b'' | xargs zgrep -il ''$c'' | xargs zgrep -il ''$d'' | xargs zgrep -il 'ST.997' | sort -u
以下は、上記のコマンドの出力例です。
example_file.dat.Z
example2_file.dat.Z
example2_file.dat.bak.1234567890.Z
example3_file.dat.Z
example3_file.dat.bak.Z
example4_file.dat.Z
example4_file.dat.bak.qwertyuiop.Z
ご覧のとおり、拡張子「.bak」を持つ同じファイルを出力します。私が望むのは、スクリプトを実行するたびにファイルを除外/表示しないことです。この例の出力と同じです。
example_file.dat.Z
example2_file.dat.Z
example3_file.dat.Z
example4_file.dat.Z
編集する:忘れてしまいました。時にはzipファイルの場合もあります。
答え1
私の意見は次のとおりです。
$ find . \( -name '*.bak*' -prune \) -o \
-type f -mtime "-$a" \
-exec zgrep -iq -e "$b" {} ';' \
-exec zgrep -iq -e "$c" {} ';' \
-exec zgrep -iq -e "$d" {} ';' \
-exec zgrep -iq 'ST.997' {} ';' \
-print | sort
または
$ find . ! -name '*.bak*' \
-type f -mtime "-$a" \
-exec zgrep -iq -e "$b" {} ';' \
-exec zgrep -iq -e "$c" {} ';' \
-exec zgrep -iq -e "$d" {} ';' \
-exec zgrep -iq 'ST.997' {} ';' \
-print | sort
それぞれの「述語」は、見つかった内容の「テスト」としてfind
機能します。find
1つのテストが失敗した場合、次の述語は評価されず(特に指定のない限り、各述語の間に暗黙の「論理的AND」がある)、次に見つかった名前が考慮されます。
- この
\( -name "*.bak" -prune \)
ビットは、「名前が指定されたパターンと一致する場合は検索結果から削除します」を意味します。これウォラーラインに置き換えることができます! -name '*.bak*'
。 -o
「論理的OR」を意味します。-type f
通常のファイルにのみ適用されます。-mtime "-$a"
これは、修正タイムスタンプが$a
24時間未満のファイルに適用されます。-exec zgrep -q ... {} ';'
指定されたパターンがファイル内で一致するzgrep
か、むしろゼロ終了状態で終了する場合(一致するものが見つかったが出力が生成されない場合)、zgrep -q
それぞれはtrueです。フラグは、指定された変数の値がパターンとして機能するように強制します(変数の1つがで始まる場合は重要です-e
)。zgrep
-
-print
名前が出力されます(条件は常に「true」です)。
変えたくないならみんなgrep -v '\.bak'
コマンドの場合、ハッキングされた修正方法は単に元のコマンドの結果を渡すことですがgrep -vF '.bak'
、現在のコマンドではエキゾチックなファイル名(改行文字を含む名前など)を持つファイルに問題が発生します。
答え2
ついに答えを見つけました。長い実験の終わりに。笑
ここにいる:
find -mtime -$a -type f ! -name "*.bak*" | xargs zgrep -il "$b" | xargs zgrep -il "$c" | xargs zgrep -il "$d" | xargs zgrep -il 'ST.997' | sort -u