Como resultado de saída de um comando find que exclui certa extensão de arquivo

0

Aqui está o meu comando de localização:

find -mtime -$a | xargs zgrep -il ''$b'' | xargs zgrep -il ''$c'' | xargs zgrep -il ''$d'' | xargs zgrep -il 'ST.997' | sort -u

Este é um exemplo de saída do comando acima:

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

Como você vê, ele gera os mesmos arquivos com a extensão ".bak". O que eu quero é excluir / não mostrar esse arquivo sempre que eu executar meu script. Como neste exemplo de saída:

example_file.dat.Z
example2_file.dat.Z
example3_file.dat.Z
example4_file.dat.Z

EDIT: eu esqueci. Às vezes é no arquivo zip.

    
por WashichawbachaW 22.08.2017 / 10:35

2 respostas

-1

Eu finalmente encontrei a resposta. Depois de longas horas de experimentos. haha

Aqui está:

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
    
por 22.08.2017 / 11:03
6

Aqui está minha opinião sobre isso:

$ 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

ou

$ 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

Cada "predicado" dado a find atuará como um "teste" nas coisas que find encontrar. Se um teste falhar, o próximo predicado não será avaliado (há um "AND lógico" implícito entre cada um, a menos que seja indicado o contrário) e o próximo nome encontrado é considerado.

  1. O \( -name "*.bak" -prune \) bit significa "se o nome corresponder ao padrão fornecido, remova-o dos resultados da pesquisa". Esta linha wole pode ser substituída por ! -name '*.bak*' .
  2. -o significa "OR lógico".
  3. -type f será verdadeiro apenas para arquivos regulares.
  4. -mtime "-$a" será verdadeiro para arquivos que tenham um registro de data e hora de modificação menor que $a 24h-periods atrás.
  5. Cada -exec zgrep -q ... {} ';' será true se o padrão determinado foi correspondido no arquivo, ou melhor, se zgrep sair com um status de saída zero (que zgrep -q faz se uma correspondência for encontrada, mas não será produzir qualquer saída). O sinal -e to zgrep forçará os valores das variáveis dadas a agir como padrões (isso importa se algum deles começar com - ).
  6. -print produzirá o nome (esse predicado é sempre "verdadeiro").

Se você não está disposto a mudar o comando todo , uma correção hackeada seria simular o resultado do seu comando original através de grep -v '\.bak' ou grep -vF '.bak' , mas como seu comando está atualmente terá problemas com arquivos que possuem nomes de arquivos exóticos (nomes contendo novas linhas, por exemplo).

    
por 22.08.2017 / 10:48