特定のファイル拡張子を除いてfindコマンドの結果を出力する方法

特定のファイル拡張子を除いてfindコマンドの結果を出力する方法

これは私の検索コマンドです。

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機能します。find1つのテストが失敗した場合、次の述語は評価されず(特に指定のない限り、各述語の間に暗黙の「論理的AND」がある)、次に見つかった名前が考慮されます。

  1. この\( -name "*.bak" -prune \)ビットは、「名前が指定されたパターンと一致する場合は検索結果から削除します」を意味します。これウォラーラインに置き換えることができます! -name '*.bak*'
  2. -o「論理的OR」を意味します。
  3. -type f通常のファイルにのみ適用されます。
  4. -mtime "-$a"これは、修正タイムスタンプが$a24時間未満のファイルに適用されます。
  5. -exec zgrep -q ... {} ';'指定されたパターンがファイル内で一致するzgrepか、むしろゼロ終了状態で終了する場合(一致するものが見つかったが出力が生成されない場合)、zgrep -qそれぞれはtrueです。フラグは、指定された変数の値がパターンとして機能するように強制します(変数の1つがで始まる場合は重要です-e)。zgrep-
  6. -print名前が出力されます(条件は常に「true」です)。

変えたくないならみんなgrep -v '\.bak'コマンドの場合、ハッキングされた修正方法は単に元のコマンドの結果を渡すことですがgrep -vF '.bak'、現在のコマンドではエキゾチックなファイル名(改行文字を含む名前など)を持つファイルに問題が発生します。

おすすめ記事