Estou querendo compactar alguns PDFs em lote, usando o truque de conversão para/de ps descrito em outro lugar. Tenho uma função definida em um arquivo .zshrc:
function pdfcompress() {
for f in "$1"; do
echo "compressing $1"
pdf2ps "$f" "$f".ps
ps2pdf -dPDFSETTINGS=/default "$f".ps "$f"
rm "$f".ps
done
}
Meu entendimento é que eu deveria conseguir passar uma lista de PDFs, e ele os compacta. No entanto, acontece o seguinte:
% ls | pdfcompress
compressing
Error: /undefinedfilename in --findlibfile--
Operand stack:
()
Execution stack:
%interp_exit .runexec2 --nostringval-- findlibfile --nostringval-- 2 %stopped_push --nostringval-- findlibfile
findlibfile false 1 %stopped_push findlibfile 1815 1 3 %oparray_pop findlibfile
Dictionary stack:
--dict:743/1123(ro)(G)-- --dict:0/20(G)-- --dict:85/200(L)--
Current allocation mode is local
GPL Ghostscript 10.04.0: Unrecoverable error, exit code 1
GPL Ghostscript 10.04.0: Device 'pdfwrite' requires an output file but no file was specified.
**** Unable to open the initial device, quitting.
Parece que nenhum dos nomes de arquivo está sendo passado, por algum motivo. Também tentei abordagens com find . -iname "*.pdf" -exec pdfcompress
, e canalizando para xargs pdfcompress
, mas nenhuma delas funciona porque a função não está no ambiente. Outras vezes, as variáveis de espaço reservado parecem ser interpretadas como strings literais.
Estou tentando fazer isso funcionar de alguma forma há mais de uma hora, sem sorte. Alguma dica?
Tenho uma estrutura de pastas de PDFs que gostaria de manter, então uma solução que funcionasse recursivamente dentro de diretórios seria a melhor, se possível.
Obrigado!
Você está misturando passagem de argumentos via stdin com passagem na linha de comando.
Para passar via stdin (
ls | pdfcompress
), usePara passar como argumentos (
pdfcompress *.pdf
, oupdfcompress **/*.pdf
), usePS: Pipear from
ls
é uma má ideia (veja Por que *não* analisar `ls` (e o que fazer em vez disso)? ).