Como agrupar / multiprocessar imagens de corte no terminal?
772
Tentei recortar várias imagens do mesmo tamanho, mas quando recortar 5 imagens e o processo terminar, apenas 4 imagens são recortadas, 1 imagem não é recortada, se recortar 1 imagem aparecerá um erro...
O primeiro problema parece acontecer porque ao convertreceber uma lista usará o último arquivo especificado como o nome do arquivo de saída. Todos os novos arquivos são nomeados após o último arquivo, que é deixado intocado (é improvável que seja o que você deseja ou espera, mas provavelmente é melhor do que seus arquivos serem substituídos inesperadamente).
Quando há apenas um arquivo no diretório (para que seu glob se expanda para um arquivo), convertreclama sobre a falta de imagens definidas porque espera que pelo menos um arquivo de entrada e um nome de arquivo de saída sejam especificados. A posição que você está usando para o seu glob é a posição do nome do arquivo de saída, então convertestá reclamando da falta de um arquivo de entrada em sua segunda imagem.
Para resultados mais confiáveis, você deve especificar os arquivos de entrada e saída:
Se o nome for longo, você poderá usar a conclusão de tabulação (digite os primeiros caracteres e pressione tab para que o shell termine o nome) para o arquivo de entrada e o arquivo de saída (ou seja, está funcionando bem para mim).
Para processamento em lote, você pode usar o shell para executar seu comando uma vez em cada arquivo e usar um pouco de manipulação de string para construir os novos nomes, para que os novos arquivos tenham nomes sensatos, algo como:
for f in *.jpg; do
echo convert "$f" -crop 599x500+147+200 "${f/.jpg/-cropped.jpg}"
done
Com o echona segunda linha, isso mostra quais serão os novos nomes. Se os novos nomes parecerem corretos, você poderá remover echoe executar os comandos novamente para realmente cortar as imagens.
Colocar os novos arquivos em um novo diretório pode ser mais fácil, especialmente se seus nomes de arquivos tiverem extensões diferentes...
mkdir cropped
for f in *.jpg *.png; do
echo convert "$f" -crop 599x500+147+200 cropped/"$f"
done
Novamente, você precisa remover echoantes que isso faça qualquer coisa.
O primeiro problema parece acontecer porque ao
convert
receber uma lista usará o último arquivo especificado como o nome do arquivo de saída. Todos os novos arquivos são nomeados após o último arquivo, que é deixado intocado (é improvável que seja o que você deseja ou espera, mas provavelmente é melhor do que seus arquivos serem substituídos inesperadamente).Quando há apenas um arquivo no diretório (para que seu glob se expanda para um arquivo),
convert
reclama sobre a falta de imagens definidas porque espera que pelo menos um arquivo de entrada e um nome de arquivo de saída sejam especificados. A posição que você está usando para o seu glob é a posição do nome do arquivo de saída, entãoconvert
está reclamando da falta de um arquivo de entrada em sua segunda imagem.Para resultados mais confiáveis, você deve especificar os arquivos de entrada e saída:
Se o nome for longo, você poderá usar a conclusão de tabulação (digite os primeiros caracteres e pressione tab para que o shell termine o nome) para o arquivo de entrada e o arquivo de saída (ou seja, está funcionando bem para mim).
Para processamento em lote, você pode usar o shell para executar seu comando uma vez em cada arquivo e usar um pouco de manipulação de string para construir os novos nomes, para que os novos arquivos tenham nomes sensatos, algo como:
Com o
echo
na segunda linha, isso mostra quais serão os novos nomes. Se os novos nomes parecerem corretos, você poderá removerecho
e executar os comandos novamente para realmente cortar as imagens.Colocar os novos arquivos em um novo diretório pode ser mais fácil, especialmente se seus nomes de arquivos tiverem extensões diferentes...
Novamente, você precisa remover
echo
antes que isso faça qualquer coisa.