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
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.
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
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.
\( -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*'
. -o
significa "OR lógico". -type f
será verdadeiro apenas para arquivos regulares. -mtime "-$a"
será verdadeiro para arquivos que tenham um registro de data e hora de modificação menor que $a
24h-periods atrás. -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 -
). -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).
Tags shell-script