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: