Mover pdf com string e imprimir ok ou não encontrado em todas as pesquisas de arquivos

-1

Eu estou usando o seguinte comando com pdf para procurar por strings específicas dentro de vários pdfs e mover para um diretório de destino, se houver uma correspondência:

pdfgrep -H "DESIRE STRING" TARGET/* | grep --ignore-case --perl-regexp --only-matching '.*(.PDF)'| uniq | xargs -I{} mv -i {} DESTINATION/

Gostaria de imprimir ok se uma correspondência for encontrada ou não for encontrada se não houver correspondência. É possível incluir isso na linha de comando?

Obrigado.

FXux
fonte

Respostas:

1

Existe alguma razão pela qual você está tentando fazer isso em um comando de uma linha? É complicado o suficiente para ser mais fácil de gerenciar como um pequeno script de shell. Mas, se você quer um one-liner, aqui está um exemplo que é basicamente um laço bash que chama o pdfgrep, baseado no seu exemplo:

while read line; do file=$(echo $line|awk -F: '{print $1}');printf "$file: "; echo "$line"|grep -q :0$ && echo no match && continue;echo MATCH;mv -i "$file" DESTINATION/;done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc -m 1 "DESIRE STRING" {} \;)

Observe que o pdfgrep usa a opção "-c" para determinar se o texto está ou não no arquivo PDF. Ele usa a opção "-m 1" para parar após a primeira partida, então, em teoria, deve ser executado mais rápido em arquivos grandes.

Se o seu pdfgrep não suportar a opção "-m 1", deixe esse bit desativado.

E para facilitar a leitura, aqui está o código, como pode aparecer em um script bash:

#!/bin/bash
while read line; do
  file=$(echo $line|awk -F: '{print $1}')
  printf "$file: "
  echo "$line"|grep -q :0$ && echo no match && continue
  echo MATCH
  mv -i "$file" DESTINATION/
done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc "DESIRE STRING" {} \;)

Explicação de código, linha por linha:

  1. Este é o interpretador da linha de comando. Se o script fosse executável (você pode torná-lo executável com o comando "chmod + x mv-pdf-files.sh"), você poderia executá-lo como "./mv-pdf-files.sh" e ele usaria / bin / bash para executar o script.

  2. Este é um bash enquanto loop. Ele itera sobre cada linha de saída gerada pelo comando no final do script (o comando "find")

  3. Isso pega o nome do arquivo da linha de saída e o salva em uma variável (chamada "file").

  4. Isso imprime o nome do arquivo para saída padrão, sem uma nova linha no final.

  5. Esse comando grep procura ": 0" no final da linha, o que indica que correspondências de zero do STRING foram encontradas nesse PDF. Os comandos && estão encadeados juntos; então, se nenhuma correspondência for encontrada, então o comando echo é executado e, em seguida, é chamado um bash "continue", que pula para o próximo arquivo no loop (ou seja, retorna para a linha de código # 3).

  6. Isso apenas ecoa que uma correspondência foi encontrada.

  7. Este é o comando mv real, igual ao seu código.

  8. O "feito" indica o final do loop while. O comando "find" dentro da notação <<() é o que o loop while está percorrendo. O comando find em si encontra todos os arquivos no caminho especificado (TARGET /) que terminam em .pdf (sem distinção entre maiúsculas e minúsculas). O parâmetro -exec informa ao find para executar o comando "pdfgrep" em cada arquivo, usando -H para imprimir o nome do arquivo e "-c" para imprimir o número de correspondências do STRING encontradas no arquivo PDF. Os {} caracteres no final são usados ​​internamente por "find" para representar o nome do arquivo como uma variável.

atreyu
fonte
Não, eu poderia usar um script bash, eu só não sei como hahaha.
FXux
Estou vendo 'opção inválida -m' no pdfgrep. Além disso, se eu não estou pedindo muito, você pode explicar a linha de comando?
FXux
Não está funcionando corretamente @atreyu, está movendo arquivos que não possuem a string dentro dela: /.
FXux
ah, você tem um pdfgrep mais antigo, eu acho. Eu também encontrei uma máquina minha com uma versão antiga. Minha culpa por não incluir a verificação de erros. Apenas deixe a opção "-m 1" e ela deve funcionar. Atualizada a resposta para mostrar os comandos em um formato de script. Basta abrir um editor de texto e salvar o código em um arquivo ("mv-pdf-files.sh", por exemplo) e chamá-lo assim: "sh mv-pdf-files.sh". Você pode pegar fantasia e passar os diretórios src / dest como argumentos para o script e passar a string para pesquisar como um argumento também.
atreyu
OH HOMEM, ESTÁ TRABALHANDO <3. Se eu não estou pedindo muito, você poderia explicar o roteiro? Eu amo bash, mas eu não tenho muito tempo para aprender, pelo menos neste ano.
FXux