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:
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.
Este é um bash enquanto loop. Ele itera sobre cada linha de saída gerada pelo comando no final do script (o comando "find")
Isso pega o nome do arquivo da linha de saída e o salva em uma variável (chamada "file").
Isso imprime o nome do arquivo para saída padrão, sem uma nova linha no final.
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).
Isso apenas ecoa que uma correspondência foi encontrada.
Este é o comando mv real, igual ao seu código.
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.