Para um único arquivo, $filename , você faria, se eu entendi corretamente, deseja fazer algo como
mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"
... assumindo $filename era o nome de um arquivo no diretório atual. Certo? Se não, o código abaixo também não estaria correto ...
Ok, vamos colocar isso em find com -execdir :
find . -type f -name "*PayrollSelfBill_42652301*" -execdir sh -c '
filename=$1
mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"' sh {} ';'
Isso localizaria os arquivos nos quais você está interessado e executaria o fragmento de script no mesmo diretório em que o arquivo foi encontrado (é assim que -execdir difere de -exec ). / p>
É possível que
find . -type f -name "*PayrollSelfBill_42652301*" \
-execdir mv -i {} "$( pdfgrep {} -o -e "42652301-.{10}" )" ';'
funcionaria também, na verdade, sem o shell filho adicionado ... agora que penso nisso. Mas eu me sentiria mais seguro chamando um shell filho, pois -execdir é uma opção não padrão em find .
Assumindo que $pathname é um dos arquivos encontrados, mas não é no diretório atual, o seguinte faria o mesmo para esse arquivo:
mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )"
Aqui, ${pathname%/*} iria expandir para o diretório do arquivo encontrado (é o mesmo que $( dirname "$pathname" ) ).
Isso pode funcionar
find . -type f -name "*PayrollSelfBill_42652301*" \
-exec mv -i {} "$( dirname {} )/$( pdfgrep {} -o -e "42652301-.{10}" )" ';'
Mas podemos ser um pouco mais eficientes e usar -exec ... {} + para processar vários arquivos em lote:
find . -type f -name "*PayrollSelfBill_42652301*" -exec sh -c '
for pathname do
mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )"
done' sh {} +
A diferença da solução -execdir acima é que apenas um (ou muito poucos) sh -c scripts seriam iniciados e dirname é substituído por uma substituição mais rápida, tornando-o potencialmente mais rápido do que a variação anterior isto.
Relacione-se com as duas variações nesta resposta: