Existem várias coisas erradas e complexidade desnecessária: -
- A chamada
xargsdupla significa que a segunda vê uma única linha de entrada, então{}é substituído apenas uma vez por uma única string contendo todos os nomes de arquivos correspondentes, masechonão mostra essa diferença na saída (compareecho a bcomecho "a b"). - O argumento
-0significa quexargsprecisa de um caractere nulo (') entre os argumentos de entrada e não há nenhum; isso também força a entrada a ser tratada como um único parâmetro.xargs' - Ao exibir apenas o nome do arquivo quando a condição corresponde, você obtém um nome de arquivo por linha, que pode ser canalizado diretamente para
grepsem a necessidade desedouxargs -I. - Infelizmente,
-ifforça um comando por linha de entrada e não há opção para adicionar parâmetros à direita, mas há uma rodada de trabalho simples: adicione os parâmetros à direita do fluxo de entrada.
Este é um comando simplificado com os parâmetros finais adicionados (testei com uma condição xargs -d'\n' diferente, não tendo nenhum PDF correspondente): -
{ exiftool -p '${FileName}' -if '$Subject =~/DATA/i' -q *.pdf; \
echo -e "cat\noutput\nbinder1.pdf"; } | xargs -d'\n' pdftk
A opção %code% faz o comando funcionar quando os nomes dos arquivos possuem espaços em branco incorporados.